在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ Python多重繼承屬性

Python多重繼承屬性

Python類的繼承,怎么讓一個子類C,同時(shí)繼承父類A,B的屬性?
先定義兩父類:

class A(object):
    def __init__(self, a1,a2):
        # super(ClassName, self).__init__()
        self.a1 = a1
        self.a2 = a2

    def funa(self):
        print("I'm funa")

class B(object):
    def __init__(self, b1):
        # super(ClassName, self).__init__()
        self.b1 = b1

    def funb(self):
        print("I'm funb")
        

那么子類C應(yīng)該如何寫?才能讓初始化后具有A,B中的a1,a2,b1屬性,和funa,funb方法?

class C(A,B):
    # ????????????????????
    def __init__(self):
        super().__init__()
    #?????????????????????
    pass

感覺是很基本的問題,求各位大佬解答,謝謝!

回答
編輯回答
淺淺

假設(shè)你要多重繼承的 各個父類關(guān)係是平行的, 多重繼承用於 組合各父類的成員 (Mixin 的概念), 那你可以考慮下面這個例子, 而為了展示通用性, 下面的例子中有三個可能被用來繼承的父類 A, B, C, 而其子類 (例如 X, Y)可以用任意順序來組合任意數(shù)量個父類:

# base classes

class A:
    def __init__(self, a1, a2, **kwargs):
        super().__init__(**kwargs)
        self.a1 = a1
        self.a2 = a2

    def funa(self):
        print("I'm funa")

class B:
    def __init__(self, b1, **kwargs):
        super().__init__(**kwargs)
        self.b1 = b1

    def funb(self):
        print("I'm funb")
        
class C:
    def __init__(self, c1, c2, c3, **kwargs):
        super().__init__(**kwargs)
        self.c1 = c1
        self.c2 = c2
        self.c3 = c3

    def func(self):
        print("I'm func")
# derived classes

class X(B, A, C):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        
class Y(A, B):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

使用範(fàn)例:

x = X(a1=1, a2=2, b1=3, c1=4, c2=5, c3=6)
y = Y(a1=1, a2=2, b1=3)
print(x.a1, x.a2, x.b1, x.c1, x.c2, x.c3)
x.funa()
y.funb()
print(dir(x))
print(dir(y))

結(jié)果:

1 2 3 4 5 6
I'm funa
I'm funb
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a1', 'a2', 'b1', 'c1', 'c2', 'c3', 'funa', 'funb', 'func']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a1', 'a2', 'b1', 'funa', 'funb']

我回答過的問題: Python-QA

2017年12月16日 15:25
編輯回答
怪痞

顯示調(diào)用 __init__ 方法, 方法會自己繼承,不用管(因?yàn)椴恢孛?/p>

class A(object):
    def __init__(self, a1,a2):
        # super(ClassName, self).__init__()
        self.a1 = a1
        self.a2 = a2

    def funa(self):
        print("I'm funa")

class B(object):
    def __init__(self, b1):
        # super(ClassName, self).__init__()
        self.b1 = b1

    def funb(self):
        print("I'm funb")
        
class C(A, B):
    def __init__(self, a1, a2, b1):
        A.__init__(self, a1, a2)
        B.__init__(self, b1)

c = C(1, 2, 3)
dir(c)
['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'a1',
 'a2',
 'b1',
 'funa',
 'funb']
2017年1月13日 02:51