【问题标题】:Python bind method to another instancePython绑定方法到另一个实例
【发布时间】:2025-11-27 20:45:02
【问题描述】:

我需要将来自不同类的不同实例的两个方法合并到一个类的单个实例中。

例如我定义了两个类:

class A:
    def __init__(self):
        self.name = "a"

    def print_name(self):
        print(self.name)


class B:
    def __init__(self):
        self.name = "b"

    def print_name(self):
        print(self.name)

然后我会尝试制作另一个对象 c 并且它的 print_name 方法必须返回 a.print_name()b.print_name() 的结果,所以我尝试了以下操作:

a = A()
b = B()
c = A()

c.name = "c"
c.print_name_1 = a.print_name
c.print_name_2 = b.print_name
def final_print(self):
    self.print_name_1()
    self.print_name_2()
c.print_name = MethodType(final_print, c)
c.print_name()

预期输出:

c
c

但我明白了:

a
b

我尝试按照here 的描述使用 types.MethodType,但它创建了某种带有两个参数的方法:第一个是“a”实例,第二个是“c”实例。

有什么帮助可以正确地做到这一点吗?

【问题讨论】:

  • 在每个实例的基础上覆盖方法违背了拥有一个类的目的,即为类的所有实例提供一个统一接口。
  • 我的目标是通过合并另外两个对象来创建一个新对象,我不知道如何用另一种方式做到这一点
  • 应该cA 的一个实例,还是真的应该是一个new 类的实例?另外,AB 真的需要是单独的类吗,或者ab 可以是同一个类的实例,只是name 属性的值不同?
  • 所以a,b,c继承自同一个类,我们称它为Parent,但它们是不同的类,不同的方法

标签: python class methods instance


【解决方案1】:

感谢this answer,我成功了。我正在使用方法的__func__ 属性。所以这里是代码:

c.name = "c"
c.print_name_1 = MethodType(lambda instance: copy.deepcopy(a.print_name).__func__(instance), c)
c.print_name_2 = MethodType(lambda instance: copy.deepcopy(b.print_name).__func__(instance), c)
def final_print(self):
    self.print_name_1()
    self.print_name_2()
c.print_name = MethodType(final_print, c)
c.print_name()

【讨论】:

  • 虽然这可行,但它可能不是您希望实现的任何最终目标的正确解决方案。
  • 为了更准确地描述我的意图,它是创建一个父类Parent,以及两种类型的父类A和B,它们有自己的函数print_name实现。这里我要合并A和B动态创建一个新的类或实例(上面的代码是c),它有一个同名的函数(即print_name),并且这个函数必须先执行A中定义的方法print_name , 然后是 B 中定义的方法 print_name。但是这些函数中的 self 参数是指实例 c。那么您知道如何将这些方法动态合并为一个吗?
  • 这还是很疯狂。你为什么要这样做?在 A 和 B 中使用不同名称的方法可以让您轻松拥有一个包装器,该包装器使用不同的名称分派方法,因此在 A 中您将拥有 def method(): return(a_method) 和在 B 中 def method: return(b_method)。现在在 C 中,您可以轻松地从 A 和 B 以及 def method: a_method(); return b_method() 或其他继承。
  • 切线,也许也可以看看 mixins。
  • 是的,是的,所以定义为 A:def print_name(): return a_specific_print_name() 和 B:def print_name(): return b_specific_print_name() 然后在 C def print_name(): a_specific_print_name(); b_specific_print_name()
最近更新 更多