1. 程式人生 > >面向物件 5繼承與重用性&派生&在子類中重用父類的方法

面向物件 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()