我的代码如下:
class Foo:
def foo(self):
pass
class Bar:
def foo(self):
pass
f = random.choice((Foo().foo, Bar().foo))
如何从f访问Bar
或Foo
?
f.__dict__
几乎没有帮助,但是repr(f)
给<bound method Bar.foo of <__main__.Bar object at 0x10c6eec18>>'
它必须是可能的,但是如何?
答案 0 :(得分:16)
每个绑定方法都有__self__
属性,即
绑定此方法的实例,或
None
(从here复制)
有关绑定方法的更多信息(来自Data Model):
如果访问方法(类名称空间中定义的函数) 通过一个实例,你得到一个特殊的对象:一个绑定的方法(也 调用实例方法)对象。 ...绑定方法有两个特殊之处 只读属性:
m.__self__
是方法所在的对象 操作...
因此f.__self__
将为您提供类实例:
print(f.__self__) # <__main__.Foo object at 0x7f766efeee48>
而type(f.__self__)
或f.__self__.__class__
会为您提供类型对象:
print(type(f.__self__)) # <class '__main__.Foo'>
您只能将__class__
用于old-style classes。