3

我想用使用类方法初始化类成员,但不知道如何调用它。

您能否提出一些解决方案 - 也许它非常微不足道,但我找不到解决方案?

此代码不起作用 - 我不知道为什么?

class X(object):
  @staticmethod
  def __Y():
    return 1

  CONSTANT = __Y()


x = X()
print x.CONSTANT

这将起作用,但我需要使用调用方法来初始化类成员。

class X(object):
  CONSTANT = 1

x = X()
print x.CONSTANT

注意,我不想初始化对象变量而是类变量。

4

1 回答 1

7

删除@staticmethod装饰器,第一种方法也可以。您不仅需要staticmethod在类语句中调用函数。

由于这种方式在从类实例调用时函数将不可用,因此在使用后也将其删除是一种习惯用法。在您的示例中:

class X(object):
    def __y():
      return 1

    CONSTANT = __y()
    # ... other uses of __y, if any
    del __y

要了解为什么您的方法不起作用,请考虑是什么起作用staticmethod。它将一个普通函数包装到一个描述符对象中,当从类中检索该描述符对象时,它会产生未更改的原始函数,即没有通常的“绑定方法”语义。(从实例或类中检索普通def函数将为您提供一个绑定方法,该方法会自动插入self作为第一个参数。)

但是,返回的描述符staticmethod本身是不可调用的,它的唯一作用是在通过类或实例访问时产生可调用的对象。使描述符可调用的建议被拒绝了,因为这种使用首先是错误的staticmethodstaticmethod

于 2013-05-09T07:45:07.507 回答