您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python:替换模块类中的函数

Python:替换模块类中的函数

我建议从最差到最佳(IMHO)的4种解决方案,但是当然,这也取决于您的特定限制:

替换实例方法(1):我使用函数是Python中的描述符这一事实,因此我可以使用__get__on方法AlternativeFunc将其作为实例方法获取mytest并覆盖实例testFunc方法mytest(而不会覆盖类方法) :

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.(mytest1, testMOD) mytest1.testFunc(10) # Alternative1: 11.2 mytestX = testMOD() mytestX.testFunc(10) # Original: 22

替换实例方法(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

对类方法执行猴子修补。与第一种方法不同,它更改了该类任何实例的行为:

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

创建一个从其继承的类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 2022/1/1 18:41:34 有273人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶