面向对象 5继承与重用性&派生&在子类中重用父类的方法

继承
继承指的是类与类之间的关系,是一种什么是什么的关系,

#
# class Paraentclass1:
#     pass
#
# class Paraentclass2:
#     pass
#
# class SubClass1(Paraentclass1):
#     pass
#
# class SubClass(Paraentclass1,Paraentclass2):
#     pass
#
# print(SubClass1.__bases__)
# print(SubClass.__bases__)


class Hero:


    def __init__(self,nickname,life_value,aggresivity):
        self.nickname=nickname
        self.life_value=life_value
        self.aggresivity=aggresivity

    def attack(self,enemy):
        enemy.life_value=self.aggresivity


class Garen(Hero):
    pass

g1=Garen('GG',20,100)

print(g1.nickname,g1.life_value,g1.aggresivity)
g1.x=1

print(g1.x)

#属性查找小练习

class Foo:
    def f1(self):
        print('from Foo.f1')

    def f2(self):
        print('from foo.f2')
        self.f1() #b.f1()

class Bar(Foo):
    def f1(self):
        print('from Bar.f1')

b=Bar()

b.f2()

父类MRO 列表原则:
1、子类会优先于父类
2、多个父类会根据它们在列表中的顺序被检查
3、如果对笑一个类存在两个合法的选择,选择第一个父类

当类是经典类时,多继承情况下,在要查找属性不存在时,会按照深度优先的方式查找下去

当类是新式类时,多继承情况下,在要查找属性不存在时,会按照广度优先的方式查找下去
在这里插入图片描述


'''
1、新式类
2、经典类
在python2中-->经典类:没有继承object的类,以及它的子类

'''

# class Foo:
#     pass
# class Bar(Foo):
#     pass

#在python2中-->新式类:继承object的类,以及它的子类

# class Foo(object):
#     pass
# class Bar(Foo):
#     pass

#在python3中----> 新式类  一个没有继承object的类,默认就继承object

# class Foo():
#     pass
# print(Foo.__bases__)

#验证多继承情况下属性查找

class A(object):
    def test(self):
        print('from A')
    pass

class B(A):
    # def test(self):
    #     print('from B')
    pass

class C(A):
    # def test(self):
    #     print('from C')
    pass

class D(B):
    # def test(self):
    #     print('from D')
    pass

class E(C):
    # def test(self):
    #     print('from E')
    pass

class F(D,E):
    # def test(self):
    #     print('from F')
    pass

#F,D,B,E,C,A

f=F()
f.test()

在子类中重用父类的方法




# 在子类中派生出的新的方法中重用父类的方法,有两种实现方式
#方式一:指明道姓 (不依赖继承)
# 方式二:super() (依赖继承)

# class Hero:
#
#     def __init__(self,nickname,life_value,aggresivity):
#         self.nickname=nickname
#         self.life_value=life_value
#         self.aggresivity=aggresivity
#
#     def attack(self,enemy):
#         enemy.life_value=self.aggresivity
#
#
# class Garen(Hero):
#     camp='Demacia'
#
#     def attack(self,enemy):
#         Hero.attack(self,enemy) #指明道姓
#         print('from Garen Class')
#
# class Riven(Hero):
#     camp='Noxus'
#
# g=Garen('草丛伦',100,30)
# r=Riven('瑞文',100,50)
#
# print(r.life_value)
# g.attack(r)
#
# print(r.life_value)
#


# class Hero:
#
#     def __init__(self,nickname,life_value,aggresivity):
#         self.nickname=nickname
#         self.life_value=life_value
#         self.aggresivity=aggresivity
#
#     def attack(self,enemy):
#         enemy.life_value=self.aggresivity
#
#
# class Garen(Hero):
#     camp='Demacia'
#
#     def __init__(self,nickname,life_value,aggresivity,weapon):
#         # self.nickname = nickname
#         # self.life_value = life_value
#         # self.aggresivity = aggresivity
#         Hero.__init__(self, nickname, life_value, aggresivity)
#         self.weapon=weapon
#
#
#     def attack(self,enemy):
#         Hero.attack(self,enemy) #指明道姓
#         print('from Garen Class')
#
#
#
# g=Garen('草丛伦',100,30,'金箍棒')
#
# print(g.__dict__)

# 方式二:super() (依赖继承)
# class Hero:
#
#     def __init__(self,nickname,life_value,aggresivity):
#         self.nickname=nickname
#         self.life_value=life_value
#         self.aggresivity=aggresivity
#
#     def attack(self,enemy):
#         enemy.life_value=self.aggresivity
#
#
# class Garen(Hero):
#     camp='Demacia'
#
#     def attack(self,enemy):
#         super(Garen, self).attack(enemy)  #依赖继承
#         print('from Garen Class')
#
# class Riven(Hero):
#     camp='Noxus'
#
# g=Garen('草丛伦',100,30)
# r=Riven('瑞文',100,50)
#
# g.attack(r)
# print(r.life_value)

#
# class Hero:
#
#     def __init__(self,nickname,life_value,aggresivity):
#         self.nickname=nickname
#         self.life_value=life_value
#         self.aggresivity=aggresivity
#
#     def attack(self,enemy):
#         enemy.life_value=self.aggresivity
#
#
# class Garen(Hero):
#     camp='Demacia'
#
#     def __init__(self,nickname,life_value,aggresivity,weapon):
#         # self.nickname = nickname
#         # self.life_value = life_value
#         # self.aggresivity = aggresivity
#         super().__init__(nickname,life_value,aggresivity)
#         self.weapon=weapon
#
#
#     def attack(self,enemy):
#         Hero.attack(self,enemy) #指明道姓
#         print('from Garen Class')
#
#
#
# g=Garen('草丛伦',100,30,'金箍棒')
#
# print(g.__dict__)


class A:
    def f1(self):
        print('from A')
        super(A, self).f1()

class B:
    def f1(self):
        print('from B')

class C(A,B):
    pass

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

c=C()
c.f1()

猜你喜欢

转载自blog.csdn.net/qq_42936973/article/details/82867795