• 面向对象编程——多重继承(七)


    1.继承

    继承:至少两个类,表达的是什么是什么的关系。继承存在单继承和多继承。

    子类要是没有__init__,就调用父类的,子类要是有__init__,就调用自己的,也可以引用父类的。

    class Animal(object):
        def __init__(self,name,aggressivity,life_value):
            self.name = name  # 每一只狗都有自己的昵称;
            self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;
            self.life_value = life_value  # 每一个角色都有自己的生命值;
        def eat(self):
            self.life_value += 100
    
    class Dog(Animal):  # 定义一个狗类
        def __init__(self, name, breed, aggressivity, life_value):
            # Animal.__init__(self,name,aggressivity,life_value)
            super().__init__(name,aggressivity,life_value)
            self.breed = breed
        def bite(self,people):
            people.life_value -= self.aggressivity
    
    class Person(Animal):  # 定义一个人类
        def __init__(self, name, aggressivity, life_value, money):
            # Animal.__init__(name,aggressivity,life_value)
            super().__init__(name,aggressivity,life_value)
            self.money = money
    
        def eat(self):
            print("woshi666")
    
    taibai = Person('taiba',50,250,200)  #创建一个对象
    print(taibai.life_value)    #可以调用类的属性初始化
    taibai.eat()     #调用子类的函数
    Animal.eat(taibai)   #就是要调取父类
    super(Person,taibai).eat()   #就是要调取父类
    print(taibai.life_value)

    子类之中有,但又想调用父类之中的,有两种方法:

    (1)类名.方法(实例)

    (2)super(类,对象).方法

    2.钻石继承

    在python中,允许子类继承多个基类,这种特性就是通常所说的多重继承。

    在python3之前版本中存在经典类,所谓的经典类没有指定基类的类,不过在python3中,已经不存在经典类,没有指定基类的以object作为基类。

    在经典类中,继承的法则是深度优先。

    >>> class D:
    ...     def eat(self):
    ...         print("D")
    ...
    >>> class C(D):
    ...     def eat(self):
    ...         print('C')
    ...
    >>> class B(D):
    ...     pass
    ...
    >>> class A(B,C):  #在B里,会选择D而不会选B,这就是深度优先
    ...     pass
    ...
    >>> a = A()
    >>> a.eat()
    D 

    在新式类中,继承的法则是广度优先。

    >>> class D(object):
    ...     def eat(self):
    ...         print('D')
    ...
    >>> a.eat()
    D
    >>> class C(D):
    ...     def eat(self):
    ...         print("C")
    ...
    >>> class B(D):
    ...     pass
    ...
    >>> class A(B,C):
    ...     pass
    ...
    >>> a = A()
    >>> a.eat()   #C和D之间选C,
    C

    一般情况类的继承不会超过4层,下面列出几种稍微复杂的情况。

    class F(object):
        def eat(self):
            print("F")
    
    class E(F):
        def eat(self):
            print("E")
    
    class D(F):
        def eat(self):
            print("D")
    
    class C(E):
        def eat(self):
            print("C")
    
    class B(D):
        def eat(self):
            print("B")
    
    class A(B,C):
        pass
        def eat(self):
            print("A")

    在python3中可以查询继承的顺序。

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

    相关知识:

    在python2.2之前,python中使用经典类,经典类是一种没有继承的类,所有类型都是type类型,如果经典类作为父类,子类调用父类构造函数会报错。

    在python2.2开始,为了使类的内置类型更加统一,引入了新式类,新式类每个类都继承自一个基类,默认自object,子类可以调用基类的构造函数,由于所有类都有一个公共的祖先类,所以新式类不能使用深度优先(DFS)。

  • 相关阅读:
    【转】c#基础系列1---深入理解值类型和引用类型
    【转】Aspnet Core为什么支持跨平台
    [翻译svg教程]svg学习系列 开篇
    使用docker 解决一个小问题,你也可能用的到
    增加软链接
    漫长的表白
    被社会抽了一巴掌
    杂乱五章的2015年终总结
    [资源分享]yslow 与firebug 修复版本Firefox35【绿色版本下载】
    Web前端性能测试-性能测试知多少---深入分析前端站点的性能
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7873884.html
Copyright © 2020-2023  润新知