Сначала вы должны прочитать ответ для Как работает объект метода класса?
Но было бы интересно увидеть вывод следующего кода:
def mydeco(func):
print(repr(func))
return func
class Foo:
@mydeco
@classmethod
def foo(cls):
pass
print(repr(Foo.foo))
Если вы запустите это, вы увидите
<classmethod object at 0x6ffffd1dc18>
<bound method Foo.foo of <class '__main__.Foo'>>
Итак, первая строка от декоратора mydeco()
, а вторая строка от оператора print()
внизу.Вы видите, что они разные.Причина, по которой они отличаются, заключается в том, что classmethod
отличается от ожидаемого декоратора функций.Он не возвращает вам функцию, но объект classmethod
, и он не вызывается.Однако в то же время класс Foo
, который его охватывает, помнит, что в Foo.__dict__
и когда вы вызываете метод оформленного класса, он возвращает вам вызываемый метод.
Просто потому, что classmethod
объект не вызывается.Вы не можете обернуть это с atexit.register
.Аналогичный случай для staticmethod
.
Итак, теперь вы должны понять, что зарегистрировать это в atexit
, вы можете сделать это вне класса , например:
import atexit
class Foo:
@classmethod
def foo(cls):
pass
atexit.register(Foo.foo)