gpt4 book ai didi

Python:替换模块类中的函数

转载 作者:太空狗 更新时间:2023-10-30 01:39:59 25 4
gpt4 key购买 nike

我正在尝试替换类中定义的函数,以便在不更改实际代码的情况下修改其功能(如在内部工作中)。我以前从未这样做过,因此在替换它时遇到了一些问题。

更改代码将使我能够访问我的 Python 库中的包,这不是一个很好的选择。

例如,如果模块名为 testMOD,

class testMOD(object):
def testFunc(self, variable):
var = variable
self.something = var + 12

然后我将导入 testMOD,定义一个类 (mytest = testMOD()),并访问类中定义的函数 testFunc,并将其更改为已定义的函数。

例如,

from somemodule import testMOD
mytest = testMOD()

def alternativeFunc(self, variable):
var = variable
self.something = var + 1.2

# A problem here
mytest.testFunc = alternativeFunc

如您所见,如果我只是用我定义的函数手动覆盖(?)类中的函数,它将无法正常工作。

它没有给出任何语法错误,但是,问题是被替换的函数认为“self”是函数的另一个变量,并说它需要另一个参数作为“variable”变量(我猜不是一个好名字)。

我想让替换函数与被替换函数完全一样,但要有额外的代码或一些小的修改。但是,“ self ”在类里面几乎没有发挥应有的作用。

是否有一种方法可以正确实现已定义的函数来替换导入类的函数?

最佳答案

我建议 4 种解决方案,从最差到最好(恕我直言),当然这也取决于您的具体限制条件:

  1. 替换实例方法(一):我利用函数在Python中是描述符这一事实,这样我就可以使用AlternativeFunc上的__get__方法来将其作为实例 mytest 的方法获取并覆盖实例 mytesttestFunc 方法(不覆盖类方法):

    class testMOD(object):
    def testFunc(self, variable):
    var = variable
    self.something = var + 12
    print('Original:', self.something)

    def alternativeFunc1(self, variable):
    var = variable
    self.something = var + 1.2
    print('Alternative1:', self.something)

    mytest1 = testMOD()
    mytest1.testFunc(10) # Original: 22

    mytest1.testFunc = alternativeFunc1.__get__(mytest1, testMOD)
    mytest1.testFunc(10) # Alternative1: 11.2
    mytestX = testMOD()
    mytestX.testFunc(10) # Original: 22
  2. 替换实例方法(2):这次我使用types.MethodType,比第一个解决方案可读性更好一些:

    import types

    class testMOD(object):
    def testFunc(self, variable):
    var = variable
    self.something = var + 12
    print('Original:', self.something)

    def alternativeFunc1(self, variable):
    var = variable
    self.something = var + 1.2
    print('Alternative1:', self.something)

    mytest1 = testMOD()
    mytest1.testFunc(10) # Original: 22

    funcType = types.MethodType
    mytest1.testFunc = funcType(alternativeFunc1, mytest1)
    mytest1.testFunc(10) # Alternative1: 11.2
    mytestX = testMOD()
    mytestX.testFunc(10) # Original: 22
  3. 对类方法进行猴子修补。与第一个方法不同的是,它改变了类的任何实例的行为:

    class testMOD(object):
    def testFunc(self, variable):
    var = variable
    self.something = var + 12
    print('Original:', self.something)

    def alternativeFunc2(self, variable):
    var = variable
    self.something = var + 1.2
    print('Alternative2:', self.something)

    mytest2 = testMOD()
    mytest2.testFunc(10) # Original: 22

    testMOD.testFunc = alternativeFunc2
    mytest2.testFunc(10) # Alternative2: 11.2
    mytestX = testMOD()
    mytestX.testFunc(10) # Alternative2: 11.2
  4. 创建一个继承自testMOD的类来覆盖方法:

    class testMODNew(testMOD):
    def testFunc(self, variable):
    var = variable
    self.something = var + 1.2
    print('Alternative3:', self.something)

    mytest3 = testMODNew()
    mytest3.testFunc(10) # Alternative3: 11.2

关于Python:替换模块类中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50599045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com