1.组合:某一各个对象拥有一个属性,该属性值等于另一个类的对象
为何要有组合:通过为某一个对象添加属性的方法,可以间接的将两个类关联起来,整合到一起,从而减少代码的日冗余
class OldboyPeople: shcool="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): OldboyPeople.__init__(self,name,age,sex) self.score=score self.course=[] def choose_course(self): print("%s chooseing course "% (self.name)) def tell_all_course(self): print("学生:%s的课程"%(self.name)) for obj in self.course: obj.tell_info() class OldoyTeacher(OldboyPeople): def __init__(self,name,age,sex,level): OldboyPeople.__init__(self,name,age,sex) self.level=level self.courses = [] def score(self,stu,num): stu.num=num def tell_all_course(self): print("教师:%s 教授的课程如下"%(self.name)) for obj in self.courses: obj.tell_info() class Course: def __init__(self,c_name,c_price,c_peroid): self.c_name=c_name self.c_price=c_price self.c_peroid=c_peroid def tell_info(self): print("<课程名:%s 价格:%s 周期:%s>" %(self.c_name,self.c_price,self.c_peroid)) python=Course("Python全栈开发",1000,"5.5个月") Linux=Course("Linux运维",1000,'5.5') stu=OldboyStudent("jxl",18,'男') stu.course.append(python) stu.course.append(Linux) stu.tell_all_course() te=OldoyTeacher("jxl1",19,'男',10) te.courses.append(python) te.tell_all_course()
.多态与多态性:
多态:同一类事物的不同形状
为何要用多态:
多态性:在多态的背景下,可以不再考虑对象的具体类型的前提下,直接使用对象
多态的精髓:统一
注:父类只是用来建立规范的,不能用来实例化,更无须实现内部的方法
Python 崇尚鸭子类型
import abc class Aminal(metaclass=abc.ABCMeta): @abc.abstractmethod def speak(self): print("Aminal-1111") def run(self): print("Aminal-222") class Dog(Aminal): def speak(self): print("dog-1111") def run(self): print("dog-2222") dog=Dog() dog.run()
三.封装:
装:往容器/名称空间里存放名字
封:指的是将存放在名称空间的名字给藏起来,这种隐藏对外不对内
如何封装:在类定义的属性前面,加__开头(没有__结尾)
总结:
1.__开头的属性实现的隐藏仅仅只是一种预语法意义上的变形,并不会真的限制类外部的访问
2.该变形操作只在类定义阶段检验语法是发生一次,类定义阶段之后新增的__开头的属性不会变形
3.如果父类不想让子类覆盖自己的属性,可以砸属性前加__开头
封装数据属性:将数据属性隐藏起来,类外部就无法直接操作属性,需要类内开辟一个接口来给外部使用间接的操作属性,可以在接口内定义任意的控制逻辑
封装函数的属性:隔离复杂度
class A: def __f1(self): print("a.f1") def f2(self): print("a.f2") self.__f1() #>>obj._A__f1() class B(A): def __f1(self): print("b.f1") b=B() b.f2() class People: def __init__(self,name,age): self.__name=name self.__age=age def tell_info(self): print("名字:%s,年龄:%s" %(self.__name,self.__age)) def set_inf(self,name,age): if not type(name)==str: print("名字的类型为str") return if not type(age)==int: print("年龄的类型为int") return self.__name=name self.__age=age p=People("jxl",18) p.tell_info() p.set_inf("jxl1",13) p.tell_info()
四.property:是一种装饰器,用来将类中的属伪装成数据属性
class People: def __init__(self,name,weith,height): self.name=name self.weith=weith self.height=height @property def amd(self): return self.weith/(self.height**2) p=People('jxl',60,1.7) print(p.amd)