Python: вызов нескольких единиц в множественном наследовании - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть 2 класса: A (для инициализации требуется 1 аргумент) и B (для инициализации необходимо 2 аргумента) и третий класс C, производный от A и B.

class A:
    def __init__(self, sval): 
        print("A: rcd value: ", sval)
        self.aval = sval

class B: 
    def __init__(self, sval, tval):
        print("B: rcd 2 values: ", sval, tval)
        self.aval=sval
        self.bval=tval

class C(A,B):
    def __init__(self, a, b, c):
        super().__init__(a) 
        super().__init__(b,c) # error here

c = C(1,2,3)

Когда я запускаю приведенный выше код, в последней строке появляется ошибка;Называется __init__ класса A, а не класса B.

A: rcd value:  1
Traceback (most recent call last):
  File "inheritance.py", line 20, in <module>
    c = C(1,2,3)
  File "inheritance.py", line 16, in __init__
    super().__init__(b,c) 
TypeError: __init__() takes 2 positional arguments but 3 were given

Как я могу вызвать __init__ функции как A, так и B из __init__ класса C?

Edit: я использую Python 3.5.3 на Debian Linux, хотя я предпочту решение, которое работает как на Python2, так и на Python3.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Предположим, у вас есть контроль над A и B, и вы можете избежать использования одного и того же имени атрибута в обоих.Затем, чтобы правильно использовать super, определите их следующим образом.

class A:
    def __init__(self, aval, **kwargs): 
        print("A: rcd value: ", aval)
        self.aval = sval
        super().__init__(**kwargs)

class B: 
    def __init__(self, b1val, b2val, **kwargs):
        print("B: rcd 2 values: ", b1val, b2val)
        self.b1val = b1val
        self.b2val = b2val
        super().__init__(**kwargs)

Затем C.__init__ необходимо вызвать super только один раз :

class C(A, B):
    def __init__(self, aval, b1val, b2val, **kwargs):
        super().__init__(aval=aval, b1val=b1val, b2val=b2val, **kwargs)

c = C(1, 2, 3)
0 голосов
/ 17 февраля 2019

Позвоните A.__init__() и B.__init__() вместо super().__init__()

class C(A,B):
    def __init__(self, a, b, c):
        A.__init__(self, a) 
        B.__init__(self, b, c)

Python 3 (https://repl.it/repls/CooperativeTransparentRobot):

class A:
    def __init__(self, sval): 
        print("A: rcd value: ", sval)
        self.aval = sval

class B: 
    def __init__(self, sval, tval):
        print("B: rcd 2 values: ", sval, tval)
        self.aval=sval
        self.bval=tval

class C(A,B):
    def __init__(self, a, b, c):
        A.__init__(self, a) 
        B.__init__(self, b,c) # this does not give error

c = C(1,2,3)

>> Python 3.6.1 (default, Dec 2015, 13:05:11)
>> [GCC 4.8.2] on linux
>> A: rcd value:  1
>> B: rcd 2 values:  2 3

Также работает в Python 2: https://repl.it/repls/GreenAbleBlockchain

...