python面向对象(类的继承)

一. 继承的初识

在python3中 所有的类都继承自object

class ParentClass1: pass
class ParentClass2: pass

class ChildClass(ParentClass1):pass     #单继承
class ChildClass1(ParentClass1,ParentClass2):pass     #多继承

print(ParentClass1.__base__)
print(ChildClass.__base__)       #会显示该类的一个父类
print(ChildClass1.__base__)
print(ChildClass.__bases__)
print(ChildClass1.__bases__)    #会显示该类的所有父类

二. 人狗大战

class Animal:
    def __init__(self,name,aggr,hp):
        self.name = name
        self.aggr = aggr
        self.hp = hp
    def eat(self):
        print('in Animal')

class Person(Animal):
    def __init__(self,name,sex,aggr,hp):
        self.sex = sex
        # Animal.__init__(self,name,aggr,hp)
        super().__init__(name,aggr,hp)
    def attack(self,dog):
        print('%s打了%s'%(self.name,dog.name))
        dog.hp -= self.aggr
        print(dog.hp)
    def eat(self):
        print('in Person')
        # Animal.eat(self)
        # super().eat()

class Dog(Animal):
    def __init__(self,name,kind,aggr,hp):
        self.sex = kind
        # Animal.__init__(self, name, aggr, hp)
        super().__init__(name,aggr,hp)
    def bite(self, person):
        print('%s咬了%s'%(self.name, person.name))
        person.hp -= self.aggr
        print(person.hp)

alex = Person('alex','felame',1,250)
hei = Dog('小黑','teddy',260,10000)

alex.attack(hei)
hei.bite(alex)
# alex.eat()
Person.eat(alex)
Animal.eat(alex)
super(Person,alex).eat()

三. 单继承

不要发生循环继承
依赖倒置原则 :
高层模块不应该依赖低层模块

class A:
    def wahaha(self):print('in A')

class B(A):
    def wahaha(self):print('in B')

class C(B):
    def wahaha(self):print('in C')

class D(C):
    def wahaha(self):print('in D')

d = D()
d.wahaha()

三. 多继承及钻石继承

python3中的所有类 都默认继承object

如果一个类 继承了object 这个类就被称为新式类
没有继承object类 就被称为经典类

深度优先 广度优先 都是一种遍历算法,把这个图中所有的项都走一遍,且不会重复

经典类 遵循 深度优先算法 且没有mro方法 python2
新式类 遵循 广度优先算法 有mro方法 py2 py3
py3 super
单继承中 super就是找父类
多继承 super寻找的轨迹是根据mro(广度优先)顺序的

class A:
    def wangwang(self):
        print('in A')
class B(A):
    def wangwang(self):
        super().wangwang()    # 'in C '
        print('in B')
class C(A):
    def wangwang(self):
        print('in C')
class D(B,C):pass

d = D()
d.wangwang()

 

posted @ 2018-03-07 19:48  忆殇★伤忆  阅读(140)  评论(0编辑  收藏  举报