Python - 如何在类被其他模块导入前重写其功能?
我有一个类,它是在module_x
中被引入用来创建实例的。但是在这之前,我想先修改这个类的一个方法,让它动态地加入一个特定的功能(这个修改是在一些中间件中进行的,这些中间件会在module_x
加载之前运行)。
3 个回答
1
因为每个 Python 类实际上都是一个字典(不仅仅是对象!)
所以你可以很简单地通过把类的方法和新的函数关联起来,来覆盖这些方法。
class A:
def f(self):
return 5
a = A()
a.f() #5
A.f = lambda self: 10
a.f() #10
不过你要小心使用这个方法。在大多数情况下,使用装饰器和合适的面向对象设计就能解决问题。如果你不得不覆盖类的方法,可能是你哪里做错了。
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!"
2
AndiDog和Andrew的回答都没有完全解决你的问题。不过,他们提供了一些很重要的工具,可以帮助你解决这个问题(给他们俩点赞)。我会在我的回答中使用他们的一个建议:
你需要准备三个文件:
文件1:myClass.py
class C:
def func(self):
#do something
文件2:importer.py
from myClass import *
def changeFunc():
A = C()
A.func = lambda : "I like pi"
return A
if __name__ == "importer":
A = changeFunc()
文件3:module_x.py
from importer import *
print A.func()
module_x的输出会打印出“I like pi”
希望这些对你有帮助