python 继承

一、简介

1、作用

简化代码

2、分类

一个父类可以被多个多个子类继承

一个子类可以继承多个父类—python独有

3、新式类和经典类

python3中,只含义新式类,新式类默认继承Object

python2.7中含义经典类和新式类,新式类需要继承Object

4、方法

类名.__base__查看该类的继承顺序

类.mro(),返回类的调用顺序

class A:
    print('A')


class B(A):
    print('B')


class C(A):
    print('C')


class D(B, C):
    print('D')


print(D.__bases__)      # (<class '__main__.B'>, <class '__main__.C'>)
print(D.mro())      # [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

二、单继承

1、派生

派生属性:在子类中,创建父类中没有的属性

派生方法:在子类中,创建父类中没有的方法

2、顺序

1)子类对象的调用顺序

子类属性、方法,若没有到父类的属性、方法,若没有到Object,若没有,则报错

2)调用父类

1)通过子类对象调用,若子类有同名方法,会调用子类的方法

2)通过父类名直接调用父类

3)使用super(类名, 已定义的对象名).类方法名

3、用父类的属性、方法

1)父类名.__init__(self, 父类的其它属性)

2)super().__init__(父类的其它属性)

4、super()

super()方法只在python3中存在

在类内部可以不写()内的类名和对象名

super()的本质:不是单纯找父类,而是根据调用者的节点位置的广度优先顺序来的

class Person:
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age

    def introduce(self):
        print('父类方法', self.name)


class Student(Person):
    def __init__(self, name, sex, age, grade):
        Person.__init__(self, name, sex, age)       # 通过父类直接调用__init__方法
        self.grade = grade      # 派生属性

    def gr(self):       # 派生方法
        print(self.grade)


class Worker(Person):
    def __init__(self, name, sex, age, money):
        super(Worker, self).__init__(name, sex, age)    # Worker, self 可以不写
        self.money = money      # 派生属性

    def make(self):     # 派生方法
        print(self.money)


s1 = Student('tom', 'man', 24, 99)
s1.gr()     # 99
print(s1.name)      # tom
s1.introduce()      # 父类方法 tom, 调用父类方法,若子类有同名方法,会调用子类的方法
Person.introduce(s1)    # 调用父类方法
super(Student, s1).introduce()  # 调用父类方法

三、多继承

1、一个子类继承多个父类

2、调用顺序

默认是就近原则

新式类:广度优先

经典类:深度优先

3、新式类

1)钻石继承

class D:
    print('D')


class B(D):
    print('B')
    
    
class C(A):
    print('D')
    
    
class A(B, C):
    print('A')

2)

3)

 

 4、经典类

深度优先,一条路走到黑

 ps:组合和继承怎么抉择?

  组合:什么有什么

  继承:什么是什么