Python 用不同类的实例的方法替换方法
我只是试着用一些具有类似父类的类来创建一个系统,这些类在它们之间动态地分配它们的方法,它看起来像一个函数“transform(from,to)”,它做的smth类似于from.foo=to.foo 所以,你看,我的问题是Python很难解决,所以我请求帮助 我的第一次尝试是Python 用不同类的实例的方法替换方法,python,class,methods,Python,Class,Methods,我只是试着用一些具有类似父类的类来创建一个系统,这些类在它们之间动态地分配它们的方法,它看起来像一个函数“transform(from,to)”,它做的smth类似于from.foo=to.foo 所以,你看,我的问题是Python很难解决,所以我请求帮助 我的第一次尝试是 def变换(a,b): a、 foo=b.foo A类: def foo(self): 通过 B(A)类: def foo(self): 打印(“条”) 转换(self,C()) C(A)类: def foo(self):
def变换(a,b):
a、 foo=b.foo
A类:
def foo(self):
通过
B(A)类:
def foo(self):
打印(“条”)
转换(self,C())
C(A)类:
def foo(self):
打印(“foo”)
变换(self,B())
b=C()
b、 foo()
b、 foo()
b、 foo()
b、 foo()
我想从中得到更多
foo
bar
foo
bar
但我明白了
foo
bar
bar
bar
最有趣的时刻是第一次转换成功,但下一次
我的下一次尝试是
A类:
def foo(self):
通过
def转换(自、到):
self.foo=to.foo
B(A)类:
def foo(self):
打印(“条”)
self.transform(C())
C(A)类:
def foo(self):
打印(“foo”)
self.transform(B())
b=C()
b、 foo()
b、 foo()
b、 foo()
b、 foo()
我也得到了同样的结果。您知道如何管理此转换吗?在您的代码中,它首先运行
a.foo=b.foo
,其中a
是在b=C()
创建的对象,而b是在b()创建的对象。然后当a.foo()
下次运行时,它运行B的foo(self)
其中self
就是B()
对象。在那里,它运行transform(self,C())
,其中self
仍然是使用B()
创建的对象,而不是B
处的对象。基本上,b
只修改一次,然后再也不会修改
相反,您应该先使用b.foo.\uuu func\uuuu
获取foo的未绑定函数对象,然后再将其分配给另一个对象,否则foo
中的self
将引用对象b()
。然后,可以使用类型将其绑定回目标对象。MethodType
:
from types import MethodType
def transform(a, b):
a.foo = MethodType(b.foo.__func__, a)
class A:
def foo(self):
pass
class B(A):
def foo(self):
print("bar")
transform(self, C())
class C(A):
def foo(self):
print("foo")
transform(self, B())
b = C()
b.foo()
b.foo()
b.foo()
b.foo()
您的第二次尝试也可以通过执行相同的操作进行修复:
from types import MethodType
class A:
def foo(self):
pass
def transform(self, to):
self.foo = MethodType(to.foo.__func__, self)
class B(A):
def foo(self):
print("bar")
self.transform(C())
class C(A):
def foo(self):
print("foo")
self.transform(B())
b = C()
b.foo()
b.foo()
b.foo()
b.foo()
因此,他在调用之间更改了self
对象,这就是它不起作用的原因?@geckos是的,在asker的原始代码中,它第一次运行a.foo=b.foo
,其中a
是在b=C()
创建的对象,而b是在b()
创建的对象,然后当a.foo()
下一次运行时,它将运行B的foo(self)
其中self
就是B()
对象。在那里,它将运行transform(self,C())
,其中self
是由B()
创建的对象。基本上,b
只修改了一次,然后再也没有修改过。谢谢您的解释!
from types import MethodType
class A:
def foo(self):
pass
def transform(self, to):
self.foo = MethodType(to.foo.__func__, self)
class B(A):
def foo(self):
print("bar")
self.transform(C())
class C(A):
def foo(self):
print("foo")
self.transform(B())
b = C()
b.foo()
b.foo()
b.foo()
b.foo()
foo
bar
foo
bar