В настоящее время я изучаю 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), или человек может добавить больше аргументов, чем необходимо, из-за путаницы, потенциально «теряя» важную информацию, которую он / она думали будут переданы в качестве аргументов.