[英]Python - how can I override the functionality of a class before it's imported by a different module?
我有一个在module_x
中导入的module_x
用于实例化,但首先我要覆盖类的一个方法以动态地包含一个特定的特性(在加载module_x
之前运行的一些中间件中)。
您应该知道每个类类型(如C class 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!"
AndiDog和Andrew的回答都没有完全回答你的问题。 但他们提供了最重要的工具来解决您的问题(两者都是+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”
希望这可以帮助
因为每个python类实际上都是一个字典(不仅仅是对象!)
您可以通过将类方法与新函数相关联来轻松覆盖它们。
class A:
def f(self):
return 5
a = A()
a.f() #5
A.f = lambda self: 10
a.f() #10
你应该小心使用它。 在大多数情况下,装饰器和适当的OO设计将适合您,如果您被迫覆盖类方法,也许,你做错了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.