2021/1/17 类的继承(python)

类的继承

B 继承 A类,B就叫做A的子类,派生类,A叫做 B的父类,基类,超类,B类以及B类的对象
使用A类所有的属性及方法

当未引入类的继承关系时:

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

# 狗类
class Dog():
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

# 猫类
class Cat:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

这样写代码有很多重复的地方,代码冗余

引入继承概念后

继承的优点
1.节省代码
2.增强的耦合性
3.代码规范化

子类又被称为子类,派生类。父类又被称为基类,超类。

继承分类:

单继承,及继承的特点

# 1.子类可以调用父类所有的属性及方法

class Animal:
    live = '有生命的'

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

    def eat(self):
        print(f'self---->{self}')
        print('动物需要进食')


class Person(Animal):
    pass


class Dog(Animal):
    pass


class Cat:
    pass

p1 = Person('ping', 99, 'boy')

print(p1.live)
p1.eat()
print(f'p1--->{p1}')
"""打印结果:
有生命的
self----><__main__.Person object at 0x00000248DD554668>
动物需要进食
p1---><__main__.Person object at 0x00000248DD554668>
"""

# 2.子类以及子类对象只能调用父类的属性以及方法,不能操作(增删改),当类中是可变数据类型,通过数据添加,可以改变数据,原理参考函数的浅拷贝
class Animal:
    live = '有生命的'

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

    def eat(self):
        print(f'self---->{self}')
        print('动物需要进食')


class Person(Animal):
    pass


class Dog(Animal):
    pass


class Cat:
    pass

p1 = Person('ping', 99, 'boy')
print(p1.live)
p1.live = 'xxx'
print(p1.live)
print(Animal.__dict__['live'])
"""打印结果:
有生命的
xxx
有生命的
"""
#当子类将父类的方法覆盖了,(重写父类的方法)
class Animal:
    live = '有生命的'

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

    def eat(self):
        print(f'self---->{self}')
        print('动物需要进食')


class Person(Animal):
    def eat(self):
        print('人类需要进食')


class Dog(Animal):
    pass


class Cat:
    pass

p1 = Person('ping', 99, 'boy')
# # 子类将父类的方法覆盖了,(重写父类的方法)
p1.eat()
#对象查找顺序先从对象空间找名字---->子类找名字------>父类找名字
"""打印结果:
人类需要进食
"""
#子类调用父类的方法
class Animal:
    live = '有生命的'

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

    def eat(self):
        print(f'self---->{self}')
        print('动物需要进食')


class Person(Animal):
    def __init__(self, name, age, sex, hobby):
        # Animal.__init__(self, name, age, sex)
        # super(Person, self).__init__(name, age, sex)
        super().__init__(name, age, sex)
        self.hobby = hobby
    def eat(self):
        super().eat()
        print('人类需要进食')


class Dog(Animal):
    pass


class Cat:
    pass

p1 = Person('ping', 99, 'boy', '11')
print(p1.__dict__)
p1.eat()
"""执行结果:
{'name': 'ping', 'age': 99, 'sex': 'boy', 'hobby': '11'}
self----><__main__.Person object at 0x000001A181AE4860>
动物需要进食
人类需要进食
"""

多继承

多继承的继承特性与单继承一样,但是多继承需要考虑继承查询的顺序:

经典类查询的顺序:

 

新式类继承顺序:

"""
多继承
继承顺序问题:
python2.2之前,都是经典类,python2.2直至python2.7之间存在两种类型:经典类,新式类。
python3x只有新式类
经典类:基类不继承object,查询规则依靠:深度优先原则
新式类:基类必须继承object,查询规则依靠:mro算法,
mro(Child(Base1, Base2) = [ Child ] + merge( mro(Base1), mro(Base2, [ Base1, Base2 ])
表头(列表第一个元素)表尾(表头以外的元素集合,可以为空)
[A , B, C] : 表头:A 表尾:[B, C]
"""


class O:
    pass


class D(O):
    pass


class E(O):
    pass


class F(O):
    pass


class B(D, E):
    pass


class C(E, F):
    pass


class A(B, C):
    pass

a = A()
"""
mro算法多继承算法:
mro(A) = mro(A(B,C))
       = [A] + merge(mro(B), mro(C), [B,C])

mro(B) = mro(B(D,E))
       = [B] + merge(mro(D), mro(E), [D,E])
       = [B] + merge([D,O], [E,O], [D,E])
       = [B,D] + merge([O], [E,O], [E])
       = [B,D,E,O]
       
mro(C) = mro(C(E,F))
       = [C] + merge(mro[E], mro(F), [E, F])
       = [C] + merge([E,O], [F,O], [E,F])
       = [C,E] + merge([O], [F, O], [F])
       = [C,E,F,O]

mor(A) = [A] + merge(mro(B), mro(C), [B,C])
       = [A] + merge([B,D,E,O],[C,E,F,O],[B,C])
       = [A,B] + merge([D,E,O],[C,E,F,O],[C])
       = [A,B,D] + merge([E,O],[C,E,F,O],[C])
       = [A,B,D,C] + merge([E,O],[E,F,O],[])
       = [A,B,D,C,E] + merge([O],[F,O],[])
       = [A,B,D,C,E,F,O]
"""

 

posted @ 2021-01-17 17:36  ping_sen  阅读(129)  评论(0)    收藏  举报