在元组中存储classmethod引用在变量中不起作用

时间:2009-08-11 06:19:34

标签: python

#!/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 :(得分:0)

这是因为方法实际上是Python中的函数。当您在构造的类实例上查找它们时,它们只会成为绑定方法。有关详细信息,请参阅我对this question的回答。非元组变体的工作原理是因为它在概念上与访问类方法相同。

如果要将绑定的类方法分配给类属性,则在构造类之后必须这样做:

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,)