[英]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=None
的B
實例是否有用是另一個問題。
假設您可以更改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.