Python类方法:what';实例成员和类成员之间的区别是什么?
在python中,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
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