python的模块类函数方法_Python:替换模块类中的函数

我正在尝试替换类中定义的函数,以便在不更改实际代码的情况下修改其函数(如在内部工作中).

我之前从未这样做过,因此在更换它时遇到了一些问题.

更改代码将让我访问我的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

#problem here

mytest.testFunc = alternativeFunc

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

它没有给出任何语法错误,但是,问题是被替换的函数认为’self’是函数的另一个变量,并且说它需要另一个参数用于’变量’变量(我想这不是一个好名字).

我想要做的是使替换功能与被替换的功能完全相同,但需要额外的代码或一些小修改.但是,“自我”几乎不起作用,因为它应该在课堂上.

是否有办法正确实现定义的函数来替换导入类的函数?

解决方法:

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

>替换实例方法(1):我使用的函数是Python中的描述符,因此我可以使用AlternativeFunc上的__get__方法将其作为实例mytest的方法,并覆盖实例mytest的testFunc方法(不覆盖类方法):

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):这次,我使用的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,class,function,python-module

来源: https://codeday.me/bug/20191007/1864044.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值