我有一个正在module_x
中导入的类用于实例化,但首先我要覆盖其中一个类的方法以动态包含一个特定的功能(在加载module_x
之前运行的某些中间件内部
答案 0 :(得分:2)
您应该知道每个类类型(如class C: ...
中的C)都是一个对象,因此您可以简单地覆盖类方法。只要实例不覆盖它们自己的方法(不会经常发生,因为它对单个实例没有用),每个实例都使用从其类类型继承的方法。这样,您甚至可以在创建实例后替换方法。
例如:
class C:
def m(self):
print "original"
c1 = C()
c1.m() # prints "original"
def replacement(self):
print "replaced!"
C.m = replacement
c1.m() # prints "replaced!"
C().m() # prints "replaced!"
答案 1 :(得分:2)
AndiDog和安德鲁的回答都没有完全回答你的问题。但他们提供了最重要的工具来解决您的问题(两者都是+1)。我将在答案中使用他们的一个建议:
您需要3个文件:
class C:
def func(self):
#do something
from myClass import *
def changeFunc():
A = C()
A.func = lambda : "I like pi"
return A
if __name__ == "importer":
A = changeFunc()
from importer import *
print A.func()
module_x的输出会打印“我喜欢pi”
希望这有帮助
答案 2 :(得分:1)
因为每个python类实际上都是一个字典(不仅仅是对象!)
您可以通过将类方法与新函数相关联来轻松覆盖类方法。
class A:
def f(self):
return 5
a = A()
a.f() #5
A.f = lambda self: 10
a.f() #10
你应该小心使用它。在大多数情况下,装饰者&适当的面向对象设计对你有用,如果你被迫覆盖类方法,也许你做错了。