Python如何知道类中的变量是方法还是变量?

时间:2014-03-28 04:28:30

标签: python

print(hasattr(int,         '__call__'))
print(hasattr(lambda x: x, '__call__'))
print('')

class A(object):
    a = int
    b = lambda x : x

print(A.a)
print(A.b)

结果

True
True

<type 'int'>
<unbound method A.<lambda>>

Python如何决定什么是方法(因为A.b就在这里)以及本身会是什么(A.a就在这里)?

1 个答案:

答案 0 :(得分:6)

如果它们是函数(即它们的类型为types.FunctionType),事物就会被包装到方法中。

这是因为函数类型定义了__get__方法,实现了descriptor protocol,它改变了查找A.b时发生的情况。 int和大多数其他非函数callables没有定义此方法:

>>> (lambda x: x).__get__
<method-wrapper '__get__' of function object at 0x0000000003710198>
>>> int.__get__
Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    int.__get__
AttributeError: type object 'int' has no attribute '__get__'

您可以通过定义其他类型的描述符来创建自己的方法包装器行为。一个例子是propertyproperty是一种不是函数的类型,但也定义了__get__(和__set__)来更改查找属性时发生的情况。