使用parentclass方法和child实例,调用最具体的方法(child的方法)
Using parent class method and child instance, call the most concrete method (child's method)
考虑这段代码:
class Interface():
def my_method(self, a):
print(f"Interface: {a=}")
class ChildA(Interface):
def my_method(self, a):
print(f"ChildA test: {a=}")
method = Interface.my_method
my_instance = ChildA()
method(my_instance, a=4)
这会打印 Interface: a=42
。我怎样才能让它打印 ChildA: a=42
?
显然我不想使用 ChildA.my_method,我想要一个适用于未来实施的任何新 child 类 的解决方案。
你能做的最好的就是写一个辅助函数:
def methodcaller(name):
def inner(obj, *args, **kwargs):
return getattr(obj, name)(*args, **kwargs)
return inner
method = methodcaller('my_method')
不幸的是,知道方法名称和对象将是 Interface
的实例这一事实并不能让您提前执行方法解析的任何部分。您需要提前了解具体的 class。 (此外,operator.methodcaller
不起作用,因为它要求在创建方法调用程序时提供所有方法参数。)
考虑这段代码:
class Interface():
def my_method(self, a):
print(f"Interface: {a=}")
class ChildA(Interface):
def my_method(self, a):
print(f"ChildA test: {a=}")
method = Interface.my_method
my_instance = ChildA()
method(my_instance, a=4)
这会打印 Interface: a=42
。我怎样才能让它打印 ChildA: a=42
?
显然我不想使用 ChildA.my_method,我想要一个适用于未来实施的任何新 child 类 的解决方案。
你能做的最好的就是写一个辅助函数:
def methodcaller(name):
def inner(obj, *args, **kwargs):
return getattr(obj, name)(*args, **kwargs)
return inner
method = methodcaller('my_method')
不幸的是,知道方法名称和对象将是 Interface
的实例这一事实并不能让您提前执行方法解析的任何部分。您需要提前了解具体的 class。 (此外,operator.methodcaller
不起作用,因为它要求在创建方法调用程序时提供所有方法参数。)