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