ссылка на статические методы из переменной класса - PullRequest
2 голосов
/ 03 февраля 2010

Я знаю, что у меня такой случай, но почему-то он у меня есть:

class foo
  #static method
  @staticmethod
  def test():
    pass

  # class variable
  c = {'name' : <i want to reference test method here.>}

Какой путь к этому?

Только для записи:

Я считаю, что это следует рассматривать как худшие практики Python. Использование статических методов на самом деле не пифоишно, если когда-либо ...

Ответы [ 2 ]

5 голосов
/ 03 февраля 2010
class Foo:
    # static method
    @staticmethod
    def test():
        pass

    # class variable
    c = {'name' : test }
3 голосов
/ 04 февраля 2010

Проблема в том, что статические методы в Python являются дескрипторными объектами.Таким образом, в следующем коде:

class Foo:
    # static method
    @staticmethod
    def test():
        pass

    # class variable
    c = {'name' : test }

Foo.c['name'] является объектом дескриптора, поэтому не может быть вызван.Вам нужно будет набрать Foo.c['name'].__get__(None, Foo)(), чтобы правильно вызвать test() здесь.Если вы не знакомы с дескрипторами в python, взгляните на глоссарий , и в Интернете есть множество документов.Кроме того, взгляните на этот поток , который, кажется, близок к вашему сценарию использования.

Для простоты вы, вероятно, могли бы создать этот атрибут класса c только внеопределение класса:

class Foo(object):
  @staticmethod
  def test():
    pass

Foo.c = {'name': Foo.test}

или, если хотите, погрузитесь в документацию __metaclass__.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...