2015-06-09 139 views
1

我有一个类应该是这个类的一个实例。我不能在声明行创建一个实例,因为python解释器不知道如何在那个时候构造对象。有一种可能的解决方法:在类声明后进行初始化。python中的类变量初始化

class A(object): 
    static_variable = None 

    def some_method(self, a=static_variable): 
     print a 

A.static_variable = A() 

但我需要使用该类变量作为默认参数。这样可以解决这个问题:

def some_method(self, a=None): 
    a = a if a else A.static_variable 
    print a 

但是,它看起来对我来说非常不合理。任何关于如何使用这种静态变量作为默认参数的建议将不胜感激。

+2

使用'param = None'然后测试'如果parem是None'绝对是pythonic。 –

+2

为什么实例需要成为该类的一个变量?为什么不直接在模块级别定义它? –

+0

@DanielRoseman是的,我可以在模块级别定义它,但仍不能解决默认参数的问题。 – midas

回答

0

Python不支持“静态”变量,就像C++这样的语言。所以在这种情况下,'static_variable'实际上是一个类变量,这就是为什么你遇到这个问题。我相信你已经知道这一点,但其他人可能有一天在这里绊倒,并看到我们把它称为一个静态变量,所以我们应该明白这一点为后人。

我在想,因为'static_variable'仍然是类A的成员,那么也许有一种解决办法,根本不用它作为参数。

你可以在some_method()中使用关键字参数吗?

而不是将它用作函数的默认参数,如果未使用kwarg,则可以只调用变量'A.static_variable'。

class A(object): 
    static_variable = None 

    def some_method(self, *, a=None): 
     if a: 
      print(a) 
     else: 
      print(A.static_variable) 

A.static_variable = A()