python学习的第十九天:类
面向对象编程的四大支柱
-
抽象(abstraction):提取共性(定义类就是一个抽象过程,需要做数据抽象和行为抽象)。
-
封装(encapsulation):把数据和操作数据的函数从逻辑上组装成一个整体(对象)。
隐藏实现细节,暴露简单的调用接口。
-
继承(inheritance):扩展已有的类创建新类,实现对已有类的代码复用。
-
多态(polymorphism):给不同的对象发出同样的消息,不同的对象执行了不同的行为。
方法重写:子类对父类已有的方法,重新给出自己的实现版本,这个过程叫做方法重写(override)。
在重写方法的过程中,不同的子类可以对父类的同一个方法给出不同的实现版本,那么该方法在运行时就会表现出多态行为。
两个类之间的关系
-
is-a关系:继承 —> 从一个类派生出另一个类
a student is a person
a teacher is a person
-
has-a关系:关联 —> 把一个类的对象作为另外一个类的对象的属性
a person has an identity card
a car has an engine.
- (普通)关联
- 强关联:整体和部分的关联,聚合和合成
-
use-a关系:依赖 —> 一个类的对象作为另外一个类的方法的参数或返回值
a person use a vehicle.
关于继承
-
继承:对已有的类进行扩展创建出新的类,这个过程就叫继承。
提供继承信息的类叫做父类(超类、基类),得到继承信息的类称为子类(派生类)。 -
继承是实现代码复用的一种手段,但是千万不要滥用继承。
-
子类直接从父类继承公共的属性和行为,再添加自己特有的属性和行为,
所以子类一定是比父类更强大的,任何时候都可以用子类对象去替代父类对象。 -
Python中的继承允许多重继承,一个类可以有一个或多个父类。
但如果不是必须使用多重继承的场景下,请尽量使用单一继承。 -
如果要限制一个类的对象只能拥有某些属性,可以在类中使用__slots__魔法属性
class Student:
slots = (‘name’, ‘gender’)
例子:工资(月薪)结算系统
# 三类员工:
# 部门经理:固定月薪,15000元
# 程序员:计时结算月薪,每小时200元
# 销售员:底薪+提成,底薪1800元,销售额5%提成
from abc import abstractmethod
class Employee:
def __init__(self, no, name):
self.no = no
self.name = name
@abstractmethod
def get_salary(self):
pass
class Manager(Employee):
def get_salary(self):
return 15000
class Programmer(Employee):
def __init__(self, no, name):
super().__init__(no, name)
self.working_hour = 0
def get_salary(self):
return 200 * self.working_hour
class Salesman(Employee):
def __init__(self, no, name):
super().__init__(no, name)
self.sales = 0
def get_salary(self):
return 1800 + 0.05 * self.sales
def main():
emps = [
Manager(1122, '小明'), Programmer(2233, '小红'),
Salesman(3344, '小王'), Salesman(4455, '小亮'),
Programmer(5566, '小赵'), Salesman(6677, '小李')
]
for emp in emps:
if type(emp) == Programmer:
emp.working_hour = int(input(f'请输入{emp.name}本月工作时长: '))
elif type(emp) == Salesman:
emp.sales = float(input(f'请输入{emp.name}本月销售额: '))
print(f'{emp.name}本月工资: {emp.get_salary()}元')
if __name__ == '__main__':
main()