假设我无法在另一个模块(B)中修改或直接导入类(在模块A中定义),请说:
模块A的一部分:
class Tester(ParentHere):
def run():
print 100
super(Tester, self).run()
如果我有权访问该对象,如何覆盖run()
方法?
例如我有,
模块B的一部分:
tester = factory.GetTester()
tester.run = some_method_here
如果我不能直接导入some_method_here
类或修改模块A中的原始定义,如何在此定义super(Tester, self).run()
仍然使用Tester
调用父类?
例如:
def some_method_here():
print '200 instead but do not print 100'
super(Tester, self).run()
答案 0 :(得分:1)
您仍然可以使用实例的Tester
属性来引用__class__
。所以在some_method_here
里面,您可以调用super(self.__class__, self).run()
然后运行自己的代码。这样,只要在该特定对象上调用run
,它就会执行Tester.run
中的所有代码以及您在函数中添加的任何内容。
def some_method_here(self):
# execute all your code ...
print '200 instead but do not print 100'
super(self.__class__, self).run()
在您的示例中,当它调用super
时,它仍会打印100
,因为您在自己的代码后执行Tester.run
。
即。你会看到
200 instead but do not print 100
100
在日志中。
如果您只想打印200行(即不执行Tester.run
中的代码),请不要首先调用super
。
此外,super
仅在从object
继承的类上调用时才有效,所以要注意这一点。如果Tester
未从对象继承,则无法在其上调用super
。
请注意,您无法使用tester.run = some_method_here
直接分配方法,因为some_method_here
不会收到self
参数。您必须使用tester.run = types.MethodType(some_method_here, tester)
模块执行types
。
答案 1 :(得分:1)
在some_method_here
中,添加您将在tester
电话中使用的参数super()
:
def some_method_here(tester):
print '200 instead but do not print 100'
super(type(tester), tester).run()
然后,为了获得一个插入了正确的tester
参数的可调用,请进行部分调整:
from functools import partial
tester = factory.GetTester()
tester_method_here = partial(some_method_here, type=tester)
tester.run = tester_method_here