我正在嘗試遵循與 Python OOP 書籍中的繼承相關的示例。但是,我面臨一個錯誤。
from __future__ import annotations
class ContactList(list["Contact"]):
def search(self, name: str) -> list["Contact"]:
matching_contacts: list["Contact"] = []
for contact in self:
if name in contact.name:
matching_contacts.append(contact)
return matching_contacts
class Contact:
all_contacts = ContactList()
def __init__(self, /, name: str = "", email: str = "", **kwargs) -> None:
super().__init__(**kwargs)
self.name = name
self.email = email
self.all_contacts.append(self)
def __repr__(self) -> str:
return f"{self.__class__.__name__}(" f"{self.name!r}, {self.email!r}" f")"
class AddressHolder:
def __init__(self, /, street: str = "", city: str = "", state: str = "", code: str = "", **kwargs) -> None:
super().__init__(**kwargs)
self.street = street
self.city = city
self.state = state
self.code = code
class Friend(Contact, AddressHolder):
def __init__(self, /, phone: str = "", **kwargs) -> None:
super().__init__(**kwargs)
self.phone = phone
f1 = Friend("Dusty", "[email protected]", "Elm Street", "New York City", "New York", "1100", "123-456-7890")
print(f1)
錯誤是:
Traceback (most recent call last):
File "test.py", line 41, in <module>
f1 = Friend("Dusty", "[email protected]", "Elm Street", "New York City", "New York", "1100", "123-456-7890")
TypeError: Friend.__init__() takes from 1 to 2 positional arguments but 8 were given
uj5u.com熱心網友回復:
由于Friendis 呼叫super().__init__(**kwargs)并繼承自AddressHolderand Contact,因此您希望通過提供這些類的初始化程式所需的所有引數kwargs(即,作為關鍵字引數)。kwargs您可以通過在內部列印Friend.__init__并通過關鍵字傳遞引數來了解其作業原理:
class Friend(Contact, AddressHolder):
def __init__(self, /, phone: str = "", **kwargs) -> None:
# Added line.
print(kwargs)
super().__init__(**kwargs)
self.phone = phone
# Passing phone as positional argument, all the rest as keyword arguments.
f1 = Friend("123-456-7890", name="Dusty", email="[email protected]", street="Elm Street", city="New York City", state="New York", code="1100")
print(f1)
{'name': 'Dusty', 'email': '[email protected]', 'street': 'Elm Street', 'city': 'New York City', 'state': 'New York', 'code': '1100'}
Friend('Dusty', '[email protected]')
kwargs將收集您提供的所有未在簽名中指定的關鍵字引數Friend.__init__()。由于您沒有關鍵字引數,因此所有關鍵字引數都以kwargs. super().__init__(**kwargs)將呼叫Contact.__init__(**kwargs)and AddressHolder.__init__(**kwargs),提供創建實體所需的所有引數。
您將所有引數作為positional傳遞,即沒有關鍵字。您的錯誤是告訴您這與 的簽名不對應Friend.__init__(),它只允許兩個位置引數(self和phone)。當您輸入關鍵字時,錯誤就會消失,因為所有這些引數都以kwargs.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/476338.html
