簡體   English   中英

父類方法中的 self.__class__ 缺少參數

[英]self.__class__ in parent class' method is missing arguments

我正在使用的包包含類 A。我希望我的新類 B 繼承自該類。 最小的例子:

class A():
    def __init__(self,name):
        self.name = name
    def my_method(self):
        return self.__class__(name = self.name)

class B(A):
    def __init__(self, value, name):
        self.value = value
        super().__init__(name)

B_instance = B(value = 5, name = "Bob")
B_instance.my_method()

在孩子身上調用父母的方法會拋出:

File ..., line 5, in my_method
    return self.__class__(name = self.name)
TypeError: __init__() missing 1 required positional argument: 'value'

如何在不更改 A 類中的任何內容的情況下解決此問題? 非常感謝您的幫助!

A.my_method假設A (或其任何子類)可以用單個參數實例化。 您通過向B.__init__添加所需的參數value打破了該假設。 您需要將value作為第二個參數,並將其設為可選。

class B(A):
    def __init__(self, name, value=None):
        super().__init__(name)
        self.value = value

使用A.my_method創建value=NoneB實例是否有用是另一個問題。


假設您可以更改A 那么最好首先設計它以促進子類化。

class A:
    def __init__(self, *, name, **kwargs):
        super().__init__(**kwargs)
        self.name = name

    @classmethod
    def my_method(cls, **kwargs):
        # Note: passing an explicit name argument will
        # result in a TypeError on multiple arguments for
        # the keyword argument 'name'
        return cls(name="Alice", **kwargs)

現在您可以將B定義為

class B(A):
    def __init__(self, *, value, **kwargs):
        super().__init__(**kwargs)
        self.value = value


a1 = A(name="Bob")
a2 = A.my_method()  # A(name="Alice")

b1 = B(name="Joe", value=5)
b2 = B.my_method(value=10)  # B(name="Alice", value=10)

這使用了來自https://rhettinger.wordpress.com/2011/05/26/super-considered-super/關於__init__的建議(以及擴展的替代類方法構造函數):

  • 調用時使用關鍵字參數
  • 僅顯式處理您自己的參數
  • 接受所有意外的關鍵字參數以傳遞給祖先類

暫無
暫無

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

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