Метод класса Python вне класса

Мне нужно использовать некоторую библиотеку Python, которая содержит файл с различными утилитами: классами и методами. Один из этих методов определяется следующим образом (я не могу привести весь код):

@classmethod
def do_something(cls, args=None, **kwargs):

но это объявление находится вне любого класса. Как я могу получить доступ к этому методу? Звонок через do_something(myClass) выдает ошибку: TypeError: 'classmethod' object is not callable. Какова цель создания методов классов вне классов?


person trivelt    schedule 29.08.2015    source источник
comment
Что вы имеете в виду вне любого класса? Можете ли вы предоставить минимально воспроизводимый пример?   -  person jonrsharpe    schedule 29.08.2015
comment
Этот метод находится на верхнем уровне вложенности, без каких-либо отступов.   -  person trivelt    schedule 29.08.2015
comment
Возможно ли, что у вас есть самоопределяемый декоратор под названием «метод класса», который перезаписывает это имя ключа.   -  person Stephen Lin    schedule 29.08.2015


Ответы (1)


Декоратор создает объект classmethod. Такими объектами являются дескрипторы (так же, как staticmethod, property и объекты-функции).

Возможно, код повторно использует этот объект в качестве такого дескриптора. Вы можете добавить его в класс позже:

ClassObject.attribute_name = do_something

или вы можете явно вызвать метод descriptor.__get__.

Сохраняя его как глобальный, его легче получить; если вы поместите его в класс, вам нужно будет обратиться к атрибуту класса __dict__, чтобы получить дескриптор classmethod, не вызывая его:

ClassObject.__dict__['do_something']

поскольку прямой доступ к атрибуту приведет к тому, что Python вызовет для вас метод descriptor.__get_, возвращая связанный метод:

>>> class Foo(object):
...     @classmethod
...     def bar(cls):
...         print 'called bar on {}'.format(cls.__name__)
... 
>>> Foo.bar
<bound method type.bar of <class '__main__.Foo'>>
>>> Foo.bar()
called bar on Foo
>>> Foo.__dict__['bar']
<classmethod object at 0x1076b20c0>
>>> Foo.__dict__['bar'].__get__(None, Foo)
<bound method type.bar of <class '__main__.Foo'>>
>>> Foo.__dict__['bar'].__get__(None, Foo)()
called bar on Foo
person Martijn Pieters    schedule 29.08.2015