类和类/对象和对象之间的三大关系
线段上有两个点 - has-a - 关联关系 整体不可分割的,叫做强关联/聚合 eg:人有手,车有引擎
人使用了房子 - use-a - 使用,依赖关系
学生是人 - is-a - 继承关系
继承 - 从已经有的类创建新类的过程
提供继承信息的称为父类(超类/基类)
得到继承信息的称为子类(派生类/衍生类)
通过继承我们可以将子类中的重复代码抽取到父类中
子类通过继承并复用这些代码来减少重复代码的编写
将来如果要维护子类的公共代码只需要在父类中进行操作即可
class Person(object):
def __init__(self,name,age):
self._name = name
self._age = age
@property # getter - 属性访问器
def name(self):
return self._name
@property
def age(self):
return self._age
@age.setter # setter - 属性修改器
def age(self,age):
self._age = age
def watch_av(self):
print("%s正在看片" % self._name)
class Student(Person):
def __init__(self, name, age):
super().__init__(name,age) # 从父类Person继承属性name,age
self._course = course
@property
def course(self):
return self._course
@course.setter
def study(self,course):
return "%s正在学习%s" % (self._name, course)
# 方法重写(override) - 覆盖/置换/重写
# 子类在继承父类方法之后,对方法进行了重新实现
# 当我们给子类对象发送watch_av消息时执行的是子类重写过的方法
def watch_av(self):
print("学生正在跟苍老师学习技术")
def main():
stu1 = Student(‘李牧’,40)
stu2 = Student(‘钟岳’,17)
stu1.study(‘HTML网页设计’)
stu2.watch_av()
if name == ‘main’:
main()
Python没有从语言层面支持抽象类的概念,我们可以通过abc模块来制造抽象类的效果
在定义类的时候通过指定metaclass=ABCMeta可以将类声明为抽象类
抽象类是不能创建对象的,抽象类存在的意义是专门给其他类继承
abc模块中还有一个包装器abstractmethod,通过这个包装器可以将方法包装为抽象方法,必须要求子类进行重写
from abc import ABCMeta,abstramethod
class Employee(object,metaclass=ABCMeta):
‘’‘员工’’’
def __init__(self,name):
"""初始化方法"""
self._name = name
@property
def name(self):
return self._name
@abstractemethod
def get_salary(self):
"""获得月薪..."""
pass
class Manager(Employee):
def get_salary(self):
return 15000.00
class Programmer(Employee):
def __init__(self,name):
super().__init__(name)
self._working_hour = 0
@property
def working_hour(self):
return self._working_hour
@working_hour.setter
def working_hour(self,working_hour):
self._working_hour = working_hour if working_hour > 0 else 0
def get_salary(self):
return 150.0 * self._working_hour
class Salesman(Employee):
def __init__(self,name):
super().__init__(name)
self._sales = sales
@property
def sales(self):
return self._sales
@sales.setter
def sales(self,sales):
self._sales = sales if sales > 0 else 0
def get_salary(self):
return 1200.0 + self._sales * 0.05
def main():
emps = [
Manager(‘猴子’), Programmer(‘罗刹’),
Manager(‘龙女’), Salesman(‘狐狸’),
Salesman(‘牛魔’), Programmer(‘神将’),
Programmer(‘和尚’)
]
for emp in emps:
# isinstance判定一个对象是不是指定的类型
if isinstance(emp, Programmer):
emp.working_hour = int(input(‘请输入%s本月工作时间:’ % emp.name))
elif isinstance(emp,Salesman):
emp.sales = float(input(‘请输入%s本月销售额:’ % emp.name))
# 同样是接收get_salary这个消息,但是不同的员工表现出了不同的行为
# 因为三个子类都重写了get_salary方法,所以这个方法会表现出多态行为
print(’%s本月工资为: ¥%.2f元’ % (emp.name,emp.get_salary()))
if name == ‘main’:
main()
- 上一篇:Maven下载配置和搭建
- 下一篇:亿级并发|day05-图片回显及反向代理