Python:替换模块类中的函数

发布于 2021-01-29 17:04:18

我试图替换在类中定义的函数,以便在不更改实际代码的情况下修改其功能(如内部工作)。我以前从未做过此事,因此在替换它时会遇到一些问题。更改代码将使我能够访问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’是该函数的另一个变量,并说它需要’variable’变量的另一个参数(我想那不是一个好名字)。

我要做的是使替换函数与被替换函数完全相同,但是要附加代码或进行一些小的修改。但是,“自我”在课堂上几乎没有发挥作用。是否有一种方法可以正确实现定义的函数来替换导入的类的函数?

关注者
0
被浏览
145
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看