Python类方法:what';实例成员和类成员之间的区别是什么?

Python类方法:what';实例成员和类成员之间的区别是什么?,python,static-methods,Python,Static Methods,在python中,staticmethods是“纯函数”,我可以用两种不同的方式来引用它们: >>> class A: ... @staticmethod ... def f(): ... pass ... >>> a=A() >>> A.f <function A.f at 0x7f20f8cd3f28> >>> a.f <function A.f at 0x7f20f8

在python中,
staticmethod
s是“纯函数”,我可以用两种不同的方式来引用它们:

>>> class A:
...     @staticmethod
...     def f():
...         pass
... 
>>> a=A()
>>> A.f
<function A.f at 0x7f20f8cd3f28>
>>> a.f
<function A.f at 0x7f20f8cd3f28>
>>> a.f is A.f
True
我知道
b.f
b.f
不是函数:它们是绑定方法。这意味着
cls
参数是隐式的,并且始终等于
B
。因此,我理解如果
B2
B
的子类,
B2().f是B().f
将是false,因为它们是用不同的
cls
参数绑定的方法。但是我不明白为什么
B().f是B.f
产生
False
。它们不应该是同一个对象,就像
A().f
A.f

编辑:此问题与“”不同。我知道
staticmethod
classmethod
之间的区别。我想知道一件具体的事情,在“伞式”链接问题中没有提到。

B().f
B.f
是不同的对象,因为每次通过属性访问引用非静态方法时,Python都会创建一个新的绑定方法对象

例如,
B.f是B.f
也是
False

>>> B.f is B.f
False
同样,即使实例保持不变,您也将获得一个新的方法对象:

>>> b = B()
>>> b.f is b.f
False
@staticmethod
创建一个新的静态方法对象,但是

从类或类检索静态方法对象时 实例中,实际返回的对象是包装对象,即 不受任何进一步改造的影响

(来自)


在这种情况下,
A.f
总是返回相同的
f
函数对象。

类就像一个定义。
实例
实际使用了该定义。因此,
是一个配方,
实例
是蛋糕。因为食谱不是蛋糕,只是关于如何制作蛋糕的说明,它们是不同的。@DuckPuncher你读了我问题的主体了吗?我想知道为什么
B().f是B.f
是false而
A().f是A.f
是true。另请参见此处的“用户定义方法”:FWIW,
B=B();b、 f是b.f
也是false。
>>> b = B()
>>> b.f is b.f
False