码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-11-26 11:15:15      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:alt   钻石   div   people   有一个   超过   类型   引用   init   

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)。

 

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

标签:alt   钻石   div   people   有一个   超过   类型   引用   init   

原文地址:http://www.cnblogs.com/yangmingxianshen/p/7873884.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!