Ссылка на статический атрибут как инициализация другого статического атрибута в python 3

#python #python-3.x

#python #python-3.x

Вопрос:

Я новичок в python, поэтому, пожалуйста, извините за терминологию, украденную из других языков. У меня есть класс, содержащий «статический» атрибут (список) и статический метод. Я хочу инициализировать параметр, чтобы он содержал только ссылку на метод:

 class LogFilter(object):

    @staticmethod
    def _process_friendly_time(params):
        # process params
        pass

    param_processors = [
        LogFilter._process_friendly_time
    ]

# Later
for processor in LogFilter.param_processors:
    processor(params)
  

Этот код вызывает ошибку

 NameError: name 'LogFilter' is not defined`.  
  

Но если я заменю LogFilter._process_friendly_time на just _process_friendly_time , то позже получу сообщение об ошибке…

 TypeError: 'staticmethod' object is not callable
  

Есть ли синтаксис, который позволит мне это сделать, или я должен переместить статический метод за пределы класса?

Ответ №1:

Вы не можете ссылаться на LogFilter._process_friendly_time в точке, предшествующей LogFilter определению. На этапе, когда вы в данный момент объявляете param_processors , вы находитесь на полпути к определению LogFilter : определение еще не завершено.

Вы можете переместить объявление поля в после класса.

 class LogFilter:
    @staticmethod
    def _process_friendly_time(params):
        # process params
        pass

LogFilter.param_processors = [
    LogFilter._process_friendly_time
]
  

Но подумайте, действительно ли вы получаете какую-либо выгоду от использования статического метода. Люди часто используют их по привычке из других языков, но в этом случае нет никакой пользы: автономная функция имела бы больше смысла.