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):

我只是试着用一些具有类似父类的类来创建一个系统,这些类在它们之间动态地分配它们的方法,它看起来像一个函数“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):
打印(“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