簡體   English   中英

繼承 TypeError: __init__() 接受 1 到 2 個位置參數,但給出了 8 個

[英]inheritance TypeError: __init__() takes from 1 to 2 positional arguments but 8 were given

我正在嘗試遵循與 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", "dusty@example.com", "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", "dusty@example.com", "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

由於Friend正在調用super().__init__(**kwargs)並繼承自AddressHolderContact ,因此您希望這些類的初始化程序所需的所有參數都通過kwargs提供(即,作為關鍵字參數)。 您可以通過在Friend.__init__中打印kwargs並使用關鍵字傳遞參數來了解其工作原理:

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="dusty@example.com", street="Elm Street", city="New York City", state="New York", code="1100")

print(f1)
{'name': 'Dusty', 'email': 'dusty@example.com', 'street': 'Elm Street', 'city': 'New York City', 'state': 'New York', 'code': '1100'}
Friend('Dusty', 'dusty@example.com')

kwargs將收集您提供的所有未在Friend.__init__()的簽名中指定的關鍵字參數。 由於您沒有關鍵字參數,因此所有關鍵字參數都以kwargs結尾。 super().__init__(**kwargs)將調用Contact.__init__(**kwargs)AddressHolder.__init__(**kwargs) ,提供創建實例所需的所有參數。

您將所有參數作為positional傳遞,即沒有關鍵字。 您的錯誤是告訴您這與Friend.__init__()的簽名不對應,它只允許兩個位置參數( selfphone )。 當您輸入關鍵字時,錯誤就會消失,因為所有這些參數都以kwargs結尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM