Скажем, я объявляю класс C
, и некоторые объявления очень похожи. Я хотел бы использовать функцию f
, чтобы уменьшить повторение кода для этих объявлений. Можно просто объявить и использовать f
как обычно:
>>> class C(object):
... def f(num):
... return '<' + str(num) + '>'
... v = f(9)
... w = f(42)
...
>>> C.v
'<9>'
>>> C.w
'<42>'
>>> C.f(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with C instance as first argument (got int instance instead)
Oops! Я случайно представил f
внешнему миру, но он не принимает аргумент self
(и не может по понятным причинам). Одна из возможностей будет del
функция после того, как я ее использую:
>>> class C(object):
... def f(num):
... return '<' + str(num) + '>'
... v = f(9)
... del f
...
>>> C.v
'<9>'
>>> C.f
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'C' has no attribute 'f'
Но что, если я захочу снова использовать f
позже, после объявления? Это не будет делать, чтобы удалить функцию. Я мог бы сделать его «приватным» (то есть, добавить к его имени __
) и назначить ему обработку @staticmethod
, но вызов объектов staticmethod
через ненормальные каналы становится очень прикольным:
>>> class C(object):
... @staticmethod
... def __f(num):
... return '<' + str(num) + '>'
... v = __f.__get__(1)(9) # argument to __get__ is ignored...
...
>>> C.v
'<9>'
Я должен использовать вышеупомянутое безумие, потому что staticmethod
объекты, которые являются дескрипторами, сами по себе не могут быть вызваны. Мне нужно восстановить функцию, обернутую объектом staticmethod
, прежде чем я смогу ее вызвать.
Должен быть лучший способ сделать это. Как я могу чисто объявить функцию в классе, использовать ее во время объявления, а также использовать ее позже из класса? Должен ли я даже делать это?