代码之家  ›  专栏  ›  技术社区  ›  orokusaki

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

  •  7
  • orokusaki  · 技术社区  · 14 年前

    我有一个班级正在引进 module_x 对于实例化,首先我要重写类的一个方法,以便动态地(在以前运行的一些中间件中)包含特定的特性 模块\u x 已加载。

    3 回复  |  直到 14 年前
        1
  •  2
  •   inspectorG4dget Dillon Benson    14 年前

    安迪和安德鲁的回答都不能完全回答你的问题。但是他们提供了最重要的工具来解决你的问题。我将在回答中使用他们的建议之一:

    class C:
        def func(self):
            #do something
    

    文件2:进口商.py

    from myClass import *
    def changeFunc():
        A = C()
        A.func = lambda : "I like pi"
        return A
    
    if __name__ == "importer":
        A = changeFunc()
    

    文件3:module\u x.py

    from importer import *
    print A.func()
    

    模块x的输出将打印“I like pi”

    希望这有帮助

        2
  •  2
  •   AndiDog    14 年前

    您应该知道每个类类型(如 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!"
    
        3
  •  1
  •   Andrew    14 年前

    因为每个python类实际上都是一个字典(不仅仅是对象!)
    通过将类方法与新函数相关联,可以很容易地重写它们。

    class A:
        def f(self):
            return 5
    
    a = A()
    a.f() #5
    
    A.f = lambda self: 10
    a.f() #10
    

    你应该小心使用。在大多数情况下,decorators和适当的OO设计将对您起作用,如果您被迫重写类方法,则可能会出错。