一、组合
定义:组合指的是一个对象属性的值是另一个类的对象
用途:通过某一对象添加属性(属性的值时另一个类的对象)的方式,可以间接地将两个类关联/整合/组合到一起,从而减少代码冗余
用法:
class OldboyPeople:
school='Oldboy'
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
class OldboyStudent(OldboyPeople):
def __init__(self,name,age,sex,score=0):
super().__init__(name,age,sex)
self.score=score
self.courses=[]
def choose_course(self):
print('%s choosing course' %self.name)
def tell_all_course(self):
print(('学生[%s]选修的课程如下' %self.name).center(50,'='))
for obj in self.course:
obj.tell_info()
print('='*60)
class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,sex,level):
super().__init__(name,age,sex)
self.level=level
self.courses=[]
def score(self,stu,num)
score.stu=num
def tell_all_course(self):
print(('老师[%s]教授的课程如下' %self.name).center(50,'*'))
for obj in self.course:
obj.tell_info()
print('*'*70)
class Course:
def __init__(self,c_name,c_price,c_period):
self.c_name=c_name
self.c_price=c_price
self.c_period=c_period
def tell_info(self):
print('<课程名:%s 价钱:%s 周期:%s>' %(self.c_name,self.c_price,self_period))
python=Course('python全栈开发',1900,'5mons')
linux=Course('linux架构师',900,'3mons')
stu1=OldboyStudent('刘二蛋',38,'male')
stu1.courses.append(python)
stu1.courses.append(linux)
stu1.tell_all_course()
tea1=OldboyTeacher('egon',18,'male')
tea1.courses.append(python)
tea1.tell_all_course()
二、多态
定义:多态指同一种/类事物不同的形态
用途:多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象
多态性的精髓:统一
用法:
import abc
class xxx(metaclass=abc.ABCMeta):
@abc.abstractmthod
def yyy(self):
pass
父类只是用来建立规范的,不能用来实例化,更无需实现内部的方法
鸭子类型:只要各方面都像什么,则被认为就是什么
三、封装
定义:装:往容器/名称空间里存入名字
封:代表将存放于名称空间中的名字隐藏起来,这种隐藏对外不对内
用途:封装数据属性:将数据属性隐藏起来,类外就无法直接操作属性,需要类内开辟一个接口,来间接地操作属性,可以在接口内定义控制逻辑,从而严格控制对属性的操作
封装函数属性:隔离复杂度
用法:在类内定义的属性前加__开头(没有__结束)
总结:1.__开头的属性实现的隐藏仅仅只是一种语法意义上的变形,并不会真的限制类外部的访问
2.该变形操作只在类定义阶段检测语法时发生一次,类定义阶段之后新增__开头的属性并不会变形
3.如果父类不想让子类覆盖自己的属性,可以在属性前加__开头