自动初始化变量

时间:2014-10-30 07:44:30

标签: python

我有一个命令行实用程序可以接受各种命令做什么,所以基本上有一个大的elif链将执行什么命令。一些命令使用变量(让我们称之为A),因此必须使用值进行初始化。通常我会这样做:

self.A = createContent()
doSomething(self.A.B)

现在我不想为每个需要self.A = createContent()的命令添加A所以我想问一下Python中是否有办法自动初始化变量以None为例。 createContent需要时间来处理,因此我不想将其放入构造函数中,该构造函数会针对每个命令执行。

4 个答案:

答案 0 :(得分:1)

hasattr怎么办?

if not hasattr(self, 'A') or self.A is None:
    self.A = createContent()

答案 1 :(得分:0)

如果初始化很昂贵,因此您只想在需要时初始化变量,一种Pythonic方式就是try只使用它,如果失败,则初始化它。 / p>

例如:

try:
    do_something(self.A)
except AttributeError:
    self.A = initialize(self)
    do_something(self.A)

在这种A块中无法确定尚未定义的情况下,您需要包含使用try/except的每一行代码。

另一种方法是每次像@Nsh提议的那样对A进行明确检查。但是有人,无论是你还是Python,都必须在某些时候进行检查。

答案 2 :(得分:0)

假设您的属性self.A是某种静态对象,我们可以使用property来实现它,并根据需要创建它:

class Something(object):
    @property
    def A(self):
        try:
            return self._A
        except AttributeError:
            self._A=CreateAnA()
            return self._A

这样您就不需要复制支票了。如果需要这些操作,可以添加setter等。缺点主要是当你创建它时不明显(因为它是读取属性的副作用),并且间接查找会有轻微的性能损失(使用__getattr__可以避免这种损失,代价是其他失败的查找)。

答案 3 :(得分:0)

感谢上面的建议,我想出了这个:

class myClass:
    def __getattr__(self,name):
        if name == 'attributeA':
            print "initializing A"
            self.attributeA = self.expensiveInit()
            return self.attributeA
    def doStuff(self):
        print self.attributeA
    def expensiveInit(self):
        return 'gold'


a = myClass()
a.doStuff()
a.doStuff()
a.doStuff()

你认为这是正确的/ pythonic吗?