我有一个命令行实用程序可以接受各种命令做什么,所以基本上有一个大的elif链将执行什么命令。一些命令使用变量(让我们称之为A
),因此必须使用值进行初始化。通常我会这样做:
self.A = createContent()
doSomething(self.A.B)
现在我不想为每个需要self.A = createContent()
的命令添加A
所以我想问一下Python中是否有办法自动初始化变量以None
为例。 createContent
需要时间来处理,因此我不想将其放入构造函数中,该构造函数会针对每个命令执行。
答案 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吗?