Python - 如何在类被其他模块导入之前覆盖类的功能?

时间:2010-09-25 18:04:42

标签: python

我有一个正在module_x中导入的类用于实例化,但首先我要覆盖其中一个类的方法以动态包含一个特定的功能(在加载module_x之前运行的某些中间件内部

3 个答案:

答案 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个文件:

文件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的输出会打印“我喜欢pi”

希望这有帮助

答案 2 :(得分:1)

因为每个python类实际上都是一个字典(不仅仅是对象!)
您可以通过将类方法与新函数相关联来轻松覆盖类方法。

class A:
    def f(self):
        return 5

a = A()
a.f() #5

A.f = lambda self: 10
a.f() #10

你应该小心使用它。在大多数情况下,装饰者&适当的面向对象设计对你有用,如果你被迫覆盖类方法,也许你做错了。