首先就是
继承:其实就是可以解决代码的重用!!!
通过继承分成两个种类:
一、(父类,超类,基类)
二、(子类,派生类)
因为python可以支持多继承,所以就有了单继承和多继承之分,由此又引发了另一个问题:继承顺序问题
先看单继承代码
class Animal: pass class Car(Animal): pass class Dog(Animal): pass
多继承代码
class Animal: pass class Car: pass class Tiger(Car,Animal): pass
这里就有一个查看谁是父类的方法
Tiger.__bases__()
因为python2 与python3有新式类和经典类的差别:
主要是python3其实就是继承了Object,所以,就叫新式类。都是默认的
而继承了Object,所以就会自动的继承一些父类的方法,比如就有“__str__”
通过继承,子类就可以“遗传”父类的数据属性和函数属性。类的顺序是先从自己找,没有的话在去找自己的父类的。
class Foo: def __init__(self,name): self.name=name def f1(self): print("1") def f2(self): print("2") print(self.name) self.f1() class Bar(Foo): def __init__(self,name): print(6) self.name=name def f1(self): print("bar") print(self.name) b=Bar(3) b.f2()
子类可以有自己独特的方法,也可以写一个和父类同名的方法,但是一旦写了这样的方法之后,以后就会调用自己的方法,而不是父类的。
现在就有一个需求是,既想用父类的方法,又想要用自己的方法
class Animal: def sleep(self): print("动物要睡觉了") class Cat(Animal): def sleep(self): 方法一,直接调用父类 Animal.sleep()#注意传参 方法二,用super super(cat,self).sleep()#注意传参 print("猫咪要睡觉")
继承的实现原理:
这里说的是python3中的新式类的继承顺序,遵循的是MRO
先讲最简单的方法
F.__mor__ 或者是 F.mor() 这样就能查询了
现在,就来介绍更深一层的继承的查询的逻辑:其实想一想也知道,要遍历的话就两种方式:深度优先和广度优先
在python3中,就是用了广度优先中的一个C3算法
class A: pass class B(A): pass class C(A): pass class D(B): pass class E(C): pass class F(D,F): pass
现在就来看看C3算法
首先,必须从上向下看
L(A)=A+[O]
A:AO
B=B+[AO]
B:BAO
C=C+[AO]
C:CAO
D=D+[BAO]
D:DBAO
E=E+[CAO]
E:ECAO
F=F+[DBAO]+[ECAO]
FDBECAO
注意,这里要顺序要看继承的顺序,显示D再是E
挑选的方法是,如果在第一个框中,第一个元素,在后面的位置中没有,或者是有,并且是第一个。这样就可以选出,否则,必须跳过,从下一个框中接着选。
这就是新式类继承的顺序:FDBECAO
经典类继承的顺序:FDBAEC.这里没有继承Object,用的是深度优先,一个支脉先走完,再走另一条。
抽象可以得到类,继承就是表达出抽象的结构。
接下来,就看看类与类另外的一种关系:组合
组合其实也是特别简单的:一个类的属性是另一个类的对象
继承和组合的异同:
继承可以表述为”是“的关系,白马是马
但是,组合就是一种”有“的关系,学生有成绩。
组合的两种方式
class student: def __init__(self,name,age,sex,course): self.name=name self.age=age self.sex=sex self.course=course class Course: def __init__(self,name,time,teacher,): self.name=name self.time=time self.teacher=teacher course_python=Course("python","six_month","all") relix=student("relix","23","male",course_python) 第二种方式 class student: def __init__(self,name,age,sex,course): self.name=name self.age=age self.sex=sex self.course=Course(self,name,time,teacher) class Course: def __init__(self,name,time,teacher,): self.name=name self.time=time self.teacher=teacher