python绑定方法中的__closure__属性来自哪里?

时间:2015-02-05 04:46:44

标签: python closures

# python3
def foo(a):
    class A:
        def say(self):
            print(a)
    return A
A = foo(1)
'__closure__' in dir(A.say) # True
a = A()
a.say.__closure__ # it returns the closure tuple
'__closure__' in dir(a.say) # False
'__closure__' in dir(a.say.__class__) # False
'__closure__' in dir(a.say.__class__.__class__) # False

在Python3中,A.say是一个函数,我知道它具有 __ closure __ 属性。 __ closure __ 不在dir(a.say)或其超类中,但是a.say。 __ closure __ 返回闭包元组。这让我感到困惑。 感谢。

1 个答案:

答案 0 :(得分:1)

我不知道在Python中类型instancemethod的对象的内部实现,但我认为 __ getattr __ instance method objects中的工作方式。

我的猜测是,当你说 a.say .__ closure __ 时,它首先在 dir(a.say)中查找__closure__然后在 dir上回退( a.say.im_func)

>>> a = foo(1)()
>>> print type(a.say)
>>> instancemethod

>>> a.say.im_func.__closure__
>>> (<cell at 0x10a00f980: int object at 0x7fef29e098b8>,)

>>> '__closure__' in dir(a.say.im_func)
>>> True