首先就是

继承:其实就是可以解决代码的重用!!!

通过继承分成两个种类:

  一、(父类,超类,基类)

  二、(子类,派生类)

因为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