繁体   English   中英

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

[英]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个文件:

文件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”

希望这可以帮助

因为每个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM