как написать __init__ в множественном наследовании python для создания экземпляров всех переменных

class FakeBase(object):
    def __init__(self, *args):
        pass

class Parent(FakeBase):
    def __init__(self, x=1, *args):
        super().__init__(x, *args)
        self.var1 = x

class Parent2(FakeBase):
    def __init__(self, x=3, y=4, *args):
        super().__init__(x, y, *args)
        self.var2 = x
        self.var3 = y

class Child(Parent, Parent2):
    def __init__(self, z, *args):
        super().__init__(*args)
        self.var4 = z

childObject = Child("var4", "var3", "var1", "var2")
print(childObject.var1)
print(childObject.var2)
print(childObject.var3)
print(childObject.var4)

Результат:

var3
var3
var1
var4

Я только начал заниматься множественным наследованием Python.

Здесь я могу вызвать super().__init__(x) только с одним параметром. И он будет вызывать только родительский __init__(). Я также хочу инициализировать var2 и var3. Как это сделать?

Получив ответы от ваших ответов, я попытался изменить свой код.

Но все еще не получается инициализировать все четыре параметра. И ни один из ваших ответов не сделал ни того, ни другого.

Спасибо и все еще жду ответа.


person user1947415    schedule 15.06.2014    source источник
comment
Сделайте так, чтобы все обрабатывали *args и **kwargs или имели одинаковую подпись. Кроме того, почему все является атрибутом класса?   -  person jonrsharpe    schedule 16.06.2014
comment
@jonrsharpe, да, это не моя цель. исправлено.   -  person user1947415    schedule 16.06.2014


Ответы (2)


Вот решение, основанное на предложении @jonrsharpe. Метод использует сигнатуру *args для универсальных переменных, которые передаются родителю(ям). Конкретная переменная z фиксируется отдельно и используется классом.

источник

class parent(object):
    var1=1
    def __init__(self,x=1):
        self.var1=x

class parent2(object):
    var2=11
    var3=12
    def __init__(self,x=3,y=4):
        self.var2=x
        self.var3=y

    def parprint(self):
        print(self.var2)
        print(self.var3)

class child(parent, parent2):
    var4=5
    def __init__(self, z, *args):
        super(child,self).__init__(*args)
        self.var4 = z

childobject = child(9,"var3")
print(childobject.var1)
print(childobject.var2)
print(childobject.var3)
print(childobject.var4)
childobject.parprint()

выход

var3
11
12
9
11
12
person johntellsall    schedule 15.06.2014

Происходит следующее:

  1. Дочерний элемент захватывает "var4" в свой аргумент z и передает список аргументов ["var3", "var1", "var2 "] в Родительский.
  2. Родительский элемент захватывает "var3" в свой аргумент x и передает x и args перечисляет ["var1", "var2"] в Parent2 (так что он получает и передает одно и то же значение "var3").
  3. Parent2 получает "var3" и "var1" и передает список аргументов ["var2"] в < strong>FakeBase.

Вы можете использовать *args, если знаете Порядок разрешения методов (MRO), но MRO может измениться, если вы создадите новые подклассы или суперклассы, что сделает ваш код очень нестабильным. Вместо этого лучше использовать аргументы ключевого слова **kwargs. Каждый класс берет нужную ему переменную и передает остальные.

class FakeBase(object):
    def __init__(self, **kwargs):
        pass


class Parent(FakeBase):
    def __init__(self, var1=1, **kwargs): # Takes var1 out from **kwargs.
        super().__init__(**kwargs)  # Passing on the rest {}.
        self.var1 = var1


class Parent2(FakeBase):
    def __init__(self, var2=3, var3=4, **kwargs): # Takes var2 and var3 out from **kwargs.
        super().__init__(**kwargs)  # Passing on the rest {var1: "var1"}.
        self.var2 = var2
        self.var3 = var3


class Child(Parent, Parent2):
    def __init__(self, var4, **kwargs):  # Takes var4 out from **kwargs.
        super().__init__(**kwargs)  # Passing on the rest {var1: "var1", var2: "var2", var3: "var3"}.
        self.var4 = var4

Написав это таким образом, MRO не имеет значения, и порядок аргументов при инициализации Child также не имеет значения:

childObject = Child(var1="var1", var2="var2", var3="var3", var4="var4")
print(childObject.var1, childObject.var2, childObject.var3, childObject.var4)
# OUTPUT: var1 var2 var3 var4

childObject = Child(var4="var4", var1="var1", var3="var3", var2="var2")
print(childObject.var1, childObject.var2, childObject.var3, childObject.var4)
# OUTPUT: var1 var2 var3 var4
person Ted Klein Bergman    schedule 09.07.2016