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
就在这里)?
答案 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__'
您可以通过定义其他类型的描述符来创建自己的方法包装器行为。一个例子是property
。 property
是一种不是函数的类型,但也定义了__get__
(和__set__
)来更改查找属性时发生的情况。