![](/img/trans.png)
[英]How do I get the instance method's next-in-line parent class from `super()` in Python
[英]How do I return a child class instance after running a super class method?
我有 2 個 python 類,一個是另一個的子類
class A:
def __init__(some params):
do something()
def method(params):
return A_new_A_instance
class B(A)
def __init__(some params):
super().__init__(some params)
def new_method(params):
a_instance=super.method(params)
return B(a)
對於我經常使用的一些方法,上面的方法效果很好。
問題是 class A 有很多方法,有些我正在使用,有些我正在修改,等等。還有一些我不關心。 A 中的大多數方法返回 A 的另一個實例(例如選擇、添加、重新排序數據)但是我想確保無論我調用哪個A.method()
我都想在執行B.method()
時返回 B 的實例B.method()
。
是否有一種神奇的方法可以對 A 的所有方法執行此操作,還是我需要一個一個地完成它們?
只要A
和B
的構造函數相同(它們采用相同的參數),您就可以使用工廠 function 創建A
新實例並為B
覆蓋它:
class A:
def __init__(self, *params):
pass
def _create_new_instance(self, *params):
return A(*params)
def method(self, *params):
# this will either call A._create_new_instance or
# B._create_new_instance depending on type(self)
return self._create_new_instance(*params)
class B(A):
def __init__(self, *params):
super().__init__(self, *params)
def _create_new_instance(self, *params):
return B(*params)
def new_method(self, *params):
new_b = self.method(*params)
do_something_new(new_b)
return new_b
assert isinstance(A().method(), A)
assert isinstance(B().method(), B)
我想我沒有正確表達我的問題。
我一直在尋找一種方法來使用子類中超類中的現有方法,而不知道它們是什么(或懶得知道)。
我想出的解決方案如下:
有一個 function 查詢超類中的可用方法
def get_methods(class_instance):
method_list = [attribute for attribute in dir(class_instance) if callable(getattr(class_instance, attribute))
and attribute.startswith('__') is False]
return
然后你可以把這樣的東西放在__init__
中,以將這些方法放入子類中。 我正在避免使用__
方法,因為我不關心其中的大部分方法,並且還想稍后自己設置其中的一些方法,例如__str__
或__add__
。
methods=get_methods(super())
for method_name in methods:
method = getattr(super(), method_name)
self.__setattr__(method_name, classmethod(method))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.