![](/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.