You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将类A的方法作为类B属性,间接调用该方法?

实现类方法的动态绑定与调用

你要的效果完全能实现,但你给的示例代码里有两处错误:

  1. 调用时写obj.self.func()是错的,obj是A的实例,根本没有self这个属性;
  2. 直接把A.foo赋值给self.func得到的是未绑定的函数,必须和A的实例绑定后才能正常调用。

下面给你两种靠谱的实现方式,对应不同的场景:

场景一:B初始化时还没有A的实例

如果B的bar方法里才会创建A的实例,就用这种方式:

class A:
    def foo(self):
        print("Hello from foo")
    
    def baz(self):
        print("Hello from baz")

class B:
    def __init__(self, use_foo=True):
        # 这里用if-else选A的不同方法,完全符合你的需求
        if use_foo:
            self.func = A.foo
        else:
            self.func = A.baz
    
    def bar(self):
        obj = A()
        # 调用时把A的实例作为第一个参数传进去就行
        self.func(obj)

# 测试一下
b1 = B(use_foo=True)
b1.bar()  # 输出: Hello from foo

b2 = B(use_foo=False)
b2.bar()  # 输出: Hello from baz

场景二:B初始化时已经拿到A的实例

如果创建B的时候就有A的实例了,可以直接把绑定好的方法存起来,调用更省事:

class A:
    def foo(self):
        print("Hello from foo")
    
    def baz(self):
        print("Hello from baz")

class B:
    def __init__(self, obj: A, use_foo=True):
        self.obj = obj
        # 直接用实例访问方法,得到的是绑定好的方法,调用时不用传self
        if use_foo:
            self.func = obj.foo
        else:
            self.func = obj.baz
    
    def bar(self):
        # 直接调用就行
        self.func()

# 测试
a = A()
b1 = B(a, use_foo=True)
b1.bar()  # 输出: Hello from foo

b2 = B(a, use_foo=False)
b2.bar()  # 输出: Hello from baz

简单说下原理:
Python里类的方法(比如A.foo)本质就是个函数,只有通过实例访问(比如obj.foo)的时候,才会自动绑定成“绑定方法”,调用时会自动把实例作为第一个参数传给self;要是直接拿类的方法,就得手动传实例进去。

内容的提问来源于stack exchange,提问作者mavex857

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:51:17