Python - 如何在类被其他模块导入前重写其功能?

7 投票
3 回答
3850 浏览
提问于 2025-04-16 04:35

我有一个类,它是在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”

希望这些对你有帮助

撰写回答