Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何替换基类中的函数?_Python 3.x - Fatal编程技术网

Python 3.x 如何替换基类中的函数?

Python 3.x 如何替换基类中的函数?,python-3.x,Python 3.x,我想以通用的方式替换基类中的函数,然后恢复原始基类函数。下面的程序就是一个例子。在函数A.set1中,我用一个新方法显式替换了A.f方法,这与测试函数B.t1()所演示的一样 我实际上想做的是以一种通用的方式替换A.f(),类似于函数A.set2,它将函数替换为参数,但这并不像函数B.t2()所演示的那样有效 如何使A.set2以与A.set1相同的方式工作,即使测试方法B.t1()和B.t2()产生相同的输出 现在的输出是: t1: A.f B.g A.f t2: A.f A.f A.f 代

我想以通用的方式替换基类中的函数,然后恢复原始基类函数。下面的程序就是一个例子。在函数A.set1中,我用一个新方法显式替换了A.f方法,这与测试函数B.t1()所演示的一样

我实际上想做的是以一种通用的方式替换A.f(),类似于函数A.set2,它将函数替换为参数,但这并不像函数B.t2()所演示的那样有效

如何使A.set2以与A.set1相同的方式工作,即使测试方法B.t1()和B.t2()产生相同的输出

现在的输出是:

t1:
A.f
B.g
A.f
t2:
A.f
A.f
A.f
代码是:

#!/usr/bin/env python3

import types

class A():
  def f(self):
    print("A.f")

class B(A):
  def g(self):
    print("B.g")

  def set1(self, new_f):
    original_Af = A.f
    A.f = new_f
    return original_Af

  def set2(self, new_f, old_f):
    original_Af = old_f
    old_f = new_f
    return original_Af

  def t1(self):
    print("t1:")
    self.f()
    original_f = self.set1(types.MethodType(B.g, self))
    self.f() # calls B.g()!
    self.set1(original_f)
    self.f()

  def t2(self):
    print("t2:")
    self.f()
    original_f = self.set2(types.MethodType(B.g, self), A.f)
    self.f() # Does not call B.g() but A.f(). Why?
    self.set2(original_f, A.f)
    self.f()

b = B()
b.t1()
b.t2()
在Python中(通常在高级语言中),参数是通过引用传递的,但引用本身是通过值传递的。在
set2
中,参数
old\u f
是对
a.f
的引用,因此可以修改
a.f
的任何内部状态,但不能更改引用本身
old\u f=
只需重新分配局部变量的值

  def set2(self, new_f, old_f):
    original_Af = old_f
    old_f = new_f
    return original_Af
这里有一种使用
getattr
setattr
的通用方法

  def set2(self, new_f, old, func_name):
    original_Af = getattr(old, func_name)
    setattr(old, func_name, new_f)
    return original_Af