在类中替换方法参考自己

时间:2017-08-09 22:56:58

标签: python python-2.7

假设我无法在另一个模块(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()

2 个答案:

答案 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