2013-05-09 42 views
3

我想用类方法初始化类成员,但不知道如何调用它。Python和类变量的初始化 - 如何使用类方法初始化成员?

你可以提出一些解决方案 - 也许这是非常平凡的,但我找不到解决方案?

这段代码不起作用 - 我不是为什么?

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 

注意,我不希望初始化对象变量,但类变量。

回答

5

删除@staticmethod装饰器,第一种方法也可以。你不需要staticmethod只是调用一个类声明中的函数。

由于这种方式在从类实例中调用函数时不可用,所以在使用后也可以将其删除。在您的例子:

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

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

要理解为什么你的方法没有奏效,考虑什么staticmethod一样。它将一个正常函数包装到一个descriptor object中,当从类中检索时,产生原始函数不变,即没有通常的“绑定方法”语义。 (检索从实例或类普通def功能会得到你自动地插入self作为第一个参数绑定方法。)

然而,staticmethod返回的描述符本身不是可调用的,其唯一的功能是产生通过类或实例访问时的可调用对象。 Proposals使staticmethod描述符被调用被拒绝,因为staticmethod的这种用法是erroneous in the first place

+0

只是好奇,滴''staticmethod'会把'def __Y()'变成'def __Y(self)',对吧?如何在不实例化类的情况下调用该方法?在这种情况下,'CONSTANT = __Y(X())'? – 2013-05-09 07:50:28

+1

@Bibhas不,只有在通过类或实例访问'__Y'时才会插入'self'。如果你从类定义中调用它,一个'def'就是一个'def'。由于首先没有魔法发生,你不需要'@ staticmethod'来防止它发生。 – user4815162342 2013-05-09 07:52:17

+0

@Bibhas Do调用'x .__ Y()'其中x是一些实例化的对象。相反,在类定义中调用'__Y()'不会导致'__Y(self)'。 – 2013-05-09 07:53:31