Как я могу реализовать super () с несколькими наследованиями инициализации? - PullRequest
1 голос
/ 28 января 2020

Я выполнял упражнение, которое включало множественное наследование с инициализаторами, для которых требовалось несколько аргументов, и подумал, как super () может решить эту проблему вместо ручного вызова каждого суперкласса?


class One:
    def __init__(self, address, phone):
        self.address = address
        self.phone = phone

class Two:
    def __init__(self, city):
        self.city = city

class Three(One,Two):
    def __init__(self, country, address, phone, city):
        self.country = country
        One.__init__(self, address, phone)
        Two.__init__(self, city)
        print(f"{address}, " + f"{phone}, " + f"{self.city}, " + f"{self.country}")

i = Three("Acountry", "AnAddress", "Aphone", "Acity")

Это прекрасно работает все аргументы печатаются хорошо и по порядку, но я не знаю, как реализовать здесь super().

Я попытался добавить 2 суперслоя на подкласс:

        super().__init__(address, phone)
        super().__init__(city)

И даже добавьте super () в родительский класс, чтобы он указывал на class Two:

class One:
    def __init__(self, address, phone, city):
        self.address = address
        self.phone = phone
        super().__init__(city)

class Two:
    def __init__(self, city):
        self.city = city

class Three(One,Two):
    def __init__(self, country, address, phone, city):
        self.country = country
        super().__init__(address, phone)
        print(f"{address}, " + f"{phone}, " + f"{self.city}, " + f"{self.country}")

i = Three("Acountry", "AnAddress", "Aphone", "Acity")

Это не работает.

Как я могу реализовать super() в оригинале код, который работает?

1 Ответ

3 голосов
/ 28 января 2020

Вам следует прочитать эту статью Раймона Хеттингера , в которой рассказывается, как работает super, и описывается, как должны выглядеть ваши классы, использующие ее. Он рекомендует передавать аргументы в качестве аргументов ключевых слов и вызывать super().__init__ в конце каждого __init__:

class One:
    def __init__(self, address, phone, **kwargs):
        self.address = address
        self.phone = phone
        super().__init__(**kwargs)

class Two:
    def __init__(self, city, **kwargs):
        self.city = city
        super().__init__(**kwargs)

class Three(One,Two):
    def __init__(self, country, address, phone, city, **kwargs):
        self.country = country
        super().__init__(address=address, phone=phone, city=city, **kwargs)
        print(f"{address}, " + f"{phone}, " + f"{self.city}, " + f"{self.country}")

i = Three("Acountry", "AnAddress", "Aphone", "Acity")
...