一、面向对象编程的含义
面向对象编程(OOP)指的是把现实世界的 “事物” 抽象成程序里的 “对象”,用对象来组织代码、处理数据和逻辑的编程思想。
生活中的所有事物都有特征和行为。面向对象编程就是把这种思维搬到代码里,“特征”在代码里就是变量、属性,而“行为”在代码里就是函数、方法。面向对象的编程可以让代码逻辑更清晰、信息更集中。
面向对象编程有两个基本概念:“类”是模版,定义了这类东西有什么属性、能做什么;而“对象”是根据类这个模版来创建的具体实例。
面向对象编程中还有三个重要概念:封装、继承、多态。
封装指的是将类的内部细节打包藏起来,只留接口给外面使用。
继承表示类的从属关系,子类可以继承父类的属性和方法,减少代码冗余。
多态指的是,同一个方法,在不同的子类里分别定义,调用时会产生不同的执行结果。
面向过程和面向对象各有不同使用场景。
主流语言中,C是纯面向过程的,Java是纯面向对象的。
二、创建类
用关键词class可以创建类。
class ClassName:
# definition
# ...
三、定义属性
类有一个特殊方法:构造函数,用于定义对象的属性,必须命名为__init__(前后是两个下划线!),括号里可以放任意个参数,但第一个参数必须表示类自身,一般叫self,可以把属性的值绑定在实例对象上。在定义属性的时候前面加上self.,才真正是定义了一个属性而不是一个普通变量。
创建对象的时候,用类名加上一个括号,括号里写上参数,__init__方法就会被调用并返回一个对象(self参数不需要手动传入)。
class Student:
def __init__(self,student_name,student_id):
self.name = student_name
self.id = student_id
self.score = {'语文':0,'数学':0,'英语':0}
stu1 = Student('张三',1)
print(f'{stu1.name}\t{stu1.id}\t{stu1.score}')

四、定义方法
接下来可以在类里面定义方法。定义方法和定义函数类似,不同之处在于要把第一个参数设为self。
比如,写一个设置学生成绩的方法:
def grade(self,subject,score):
if subject in self.score:
self.score[subject] = score
以及,再写一个打印所有成绩的方法:
def show_score(self):
print(f'学生{self.name},学号为{self.id},成绩如下:')
for subject in self.score:
print(f'{subject}:{self.score[subject]}')
然后调用一下这两个方法看看结果:
stu1 = Student('张三',1)
stu1.grade('语文',98)
stu1.grade('数学',99)
stu1.grade('英语',100)
stu1.show_score()

五、类继承
定义子类的方法是在子类的类名后面加上括号,括号里写父类的名字。
创建子类实例的时候,会优先调用子类的构造函数。在子类中可以使用用super()函数,这个函数会返回父类,调用父类的构造函数,使子类继承父类的属性。
调用类的方法时,会先在子类里找有没有对应方法,如果没有,再往上一级,在父类中找有没有同名方法。
接下来我们用一个人力系统的具体场景练练手,需求如下:
员工有两类,正式员工RegularEmployee、实习生Trainee。
两者都有属性:姓名name和工号id。
正式员工有属性月薪monthly_salary
实习生有属性日薪daily_salary和每月工作天数work_days
两者都有计算月薪 calculate_monthly_pay的方法,但是计算过程不同。
具体代码实现如下:
class Employee:
def __init__(self,name,id):
self.name = name
self.id = id
def show_info(self):
print(f'员工名字:{self.name},工号:{self.id}')
class RegularEmployee(Employee):
def __init__(self,name,id,monthly_salary):
super().__init__(name,id)
self.monthly_salary = monthly_salary
def calculate_monthly_pay(self):
return self.monthly_salary
class Trainee(Employee):
def __init__(self,name,id,daily_salary,work_days):
super().__init__(name,id)
self.daily_salary = daily_salary
self.work_days = work_days
def calculate_monthly_pay(self):
return self.daily_salary * self.work_days
zhangsan = RegularEmployee("张三",1000,6000)
lisi = Trainee("李四",1001,200,20)
print(zhangsan.calculate_monthly_pay())
print(lisi.calculate_monthly_pay())
END
2004

被折叠的 条评论
为什么被折叠?



