В питона, staticmethod
s являются «только функции», и я могу сослаться на них двумя различными способами:Python classmethods: какая разница между членом экземпляра и членом класса?
>>> 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
Оба a.f
и A.f
имена, которые ссылаются на тот же объект, который бывает «просто функция". Отлично.
Теперь, скажем, у меня есть classmethod
:
>>> class B:
... @classmethod
... def f(cls):
... pass
...
>>> b=B()
>>> b.f is B.f
False
Я знаю, что b.f
и B.f
являются не функции: они связаны mothods. Это означает, что аргумент cls
неявный и всегда равен B
. Из-за этого я бы понял, что если B2
является подклассом B
, B2().f is B().f
будет ложным, поскольку они связаны методами с различными аргументами cls
. Но я не понимаю, почему B().f is B.f
дает False
. Разве они не должны быть одним и тем же объектом, как и A().f
и A.f
?
EDIT: Этот вопрос не совпадает с «What is the difference between @staticmethod and @classmethod in Python?». Я знаю разницу между staticmethod
и classmethod
. Я хочу знать одну конкретную вещь, которая не рассматривается в связанном «зонтичном» вопросе.
Класс как определение. «Экземпляр» является фактическим использованием этого определения. Таким образом, «класс» - это рецепт, а «экземпляр» - это торт. Поскольку рецепт - это не торт, а только инструкции о том, как сделать торт, они не совпадают. – DuckPuncher
@ DuckPuncher ты прочитал тело моего вопроса? Я хочу знать, почему 'B(). F является B.f' является ложным и' A(). F является A.f' является истинным. – fonini
См. Также «Пользовательские методы» здесь: https://docs.python.org/2/reference/datamodel.html#types –