当你拥有的所有东西都是可调用的时候,是否有办法获得对方法类的访问权限

时间:2015-11-18 14:19:59

标签: python methods metaprogramming

我的代码如下:

class Foo:
    def foo(self):
        pass


class Bar:
    def foo(self):
        pass

f = random.choice((Foo().foo, Bar().foo))

如何从f访问BarFoo

f.__dict__几乎没有帮助,但是repr(f)<bound method Bar.foo of <__main__.Bar object at 0x10c6eec18>>'它必须是可能的,但是如何?

1 个答案:

答案 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