Если я исправлю метод класса с помощью функции , функция будет вести себя как метод, и self
будет передано как первый из args
.
class Spam:
pass
def eggs( *args ):
return args
Spam.eggs = eggs
spam = Spam()
print( spam.eggs() ) # ---> (<Spam>, )
# all good!
Однако, если я исправлю с использованием экземпляра object (с .__call__
), то self
больше не будет передан в качестве аргумента:
class Spam:
pass
class Beans:
def __call__( *args ):
return args
Spam.beans = Beans()
spam = Spam()
print( spam.beans() ) # ---> (<Beans>, )
# - not good, I'd expect this to be
# (<Beans>, <Spam>, )
- В приведенном выше примере, почему Python решил, что
Spam
self
будет дольше передаваться?
- Как я могу получить
Spam
self
для прохождения?
Обоснование: В целях кэширования возвращаемых значений я хотел бы изменить функции моего класса (на самом деле, используя декораторы, а не обезьяньи патчи - но это выходит за рамки этого вопроса). Вместо того, чтобы заменять методы моего класса на функции, я хотел бы использовать объекты класса, потому что это делает код более приятным, позволяя мне сохранять состояние в объектах вместо того, чтобы пытаться исправить все замыкания, используя lambda
s.