Наследовать несколько инициализаторов классов, которые имеют несколько аргументов? - PullRequest
0 голосов
/ 17 января 2020

В настоящее время я изучаю OOP и пытаюсь выполнить упражнение об эффективности **args и **kwargs при наследовании.

Для этого я использую подкласс, наследующий от 2 суперклассов с требуется инициализатор с различным количеством аргументов.

Это проблема и решение, которое я достиг:


class Contact:

    all_contacts = []

    def __init__(self,name,email):
        self.name = name
        self.email = email
        Contact.all_contacts.append(self)

class AddressHolder:
    def __init__(self, street, city, state, code):
        self.street = street
        self.city = city
        self.state = state
        self.code = code

class Friends(Contact, AddressHolder):
    def __init__(self, phone, name, email, street, city, state, code):
        self.phone = phone
        super().__init__(name, email, street, city, state, code)

Порядок аргументов в super() следует MRO: Сначала начальный класс, затем первый класс, от которого он наследуется, а затем второй класс.

Излишне говорить, что это не работает.


>>>f = Friends('Aphone', 'Aname', 'Aemail', 'Astreet', 'Acity', 'Astate', 'Acode')

Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    f = Friends('Aphone', 'Aname', 'Aemail', 'Astreet', 'Acity', 'Astate', 'Acode')
    line 20, in __init__
    super().__init__(name, email, street, city, state, code)
TypeError: __init__() takes 3 positional arguments but 7 were given

Даже если удалить дополнительные аргументы, я получу ошибка:


>>> f = Friends('Aphone', 'Aname', 'Aemail')

Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    f = Friends('Aphone', 'Aname', 'Aemail')
TypeError: __init__() missing 4 required positional arguments: 'street', 'city', 'state', and 'code'

Я бы хотел сделать эту работу без использования **args или **kwargs, просто чтобы узнать, как работает python, тогда я бы попытался реализовать решение с **args и **kwargs.

Кроме того, не опасно ли ставить **args или **kwargs в качестве аргументов?

Это может закончиться смесью аргументов (например, улица, по которой идут электронные письма go), или человек может добавить больше аргументов, чем необходимо, из-за путаницы, потенциально «теряя» важную информацию, которую он / она думали будут переданы в качестве аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...