为什么`is`对于相同的实例方法和类方法返回False,而对于静态方法返回True

Jam*_*Lin 5 python

让代码来说明问题:

>>> class A(object):
...     a = None
...     def b(self):
...             pass
... 
>>> a = A()
>>> a.a is a.a
True
>>> a.b is a.b
False

>>> class B(object):
...     a = None
...     @staticmethod
...     def b():
...             pass
... 
>>> b = B()
>>> b.a is b.a
True
>>> b.b is b.b
True

>>> class C(object):
...     a = None
...     @classmethod
...     def b(cls):
...             pass
... 
>>> c = C()
>>> c.a is c.a
True
>>> c.b is c.b
False
Run Code Online (Sandbox Code Playgroud)

小智 1

这会将方法绑定到类的对象。

a.b is a.b
<bound method A.b of <__main__.A object at 0x00000294E2DA1780>>
Run Code Online (Sandbox Code Playgroud)

这将直接寻址方法,因为我们可以直接使用类名调用静态方法,而无需创建对象来调用静态方法。

b.b is b.b
<function B.b at 0x00000294E2C49D08>
Run Code Online (Sandbox Code Playgroud)

这会将方法直接绑定到类。您可以直接使用类名调用该方法,而无需创建对象或使用对象。

c.b is c.b
<bound method C.b of <class '__main__.C'>>
Run Code Online (Sandbox Code Playgroud)