хранение ссылки на метод класса в кортеже не работает как в переменной - PullRequest
0 голосов
/ 11 августа 2009
#!/usr/bin/python

class Bar(object):

  @staticmethod
  def ruleOn(rule):
    if isinstance(rule, tuple):
      print rule[0]
      print rule[0].__get__(None, Foo)
    else:
      print rule

class Foo(object):

  @classmethod
  def callRule(cls):
    Bar.ruleOn(cls.RULE1)
    Bar.ruleOn(cls.RULE2)


  @classmethod
  def check(cls):
    print "I am check"

  RULE1   = check
  RULE2   = (check,)

Foo.callRule()

Выход:

<bound method type.check of <class '__main__.Foo'>>
<classmethod object at 0xb7d313a4>
<bound method type.check of <class '__main__.Foo'>>

Как видите, я пытаюсь сохранить ссылку на функцию classmethod в кортеже для будущего использования.

Однако, похоже, он хранит сам объект, а не ссылку на связанную функцию.

Как вы видите, это работает для ссылки на переменную.

Единственный способ получить его - использовать __get__, для которого требуется имя класса, к которому он принадлежит, который недоступен во время назначения переменной RULE.

Есть идеи у кого-нибудь?

1 Ответ

0 голосов
/ 11 августа 2009

Это потому, что метод на самом деле функции в Python. Они становятся связанными методами только тогда, когда вы просматриваете их на созданном экземпляре класса. Смотрите мой ответ на этот вопрос для более подробной информации. Вариант без кортежа работает, потому что он концептуально аналогичен доступу к методу класса.

Если вы хотите назначить связанные методы класса атрибутам класса, вам нужно будет сделать это после создания класса:

class Foo(object):
    @classmethod
    def callRule(cls):
        Bar.ruleOn(cls.RULE1)
        Bar.ruleOn(cls.RULE2)

    @classmethod
    def check(cls):
        print "I am check"

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