能否将类A的方法作为类B属性,间接调用该方法?
实现类方法的动态绑定与调用
你要的效果完全能实现,但你给的示例代码里有两处错误:
- 调用时写
obj.self.func()是错的,obj是A的实例,根本没有self这个属性; - 直接把
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
相关产品推荐
相关产品推荐

