自动初始化变量
我有一个命令行实用程序,它可以接受各种命令要执行的操作,所以基本上有一个很大的elif链会执行什么命令。有些命令使用变量(我们称之为A
),因此它必须用值初始化。所以通常我会做:自动初始化变量
self.A = createContent()
doSomething(self.A.B)
现在我不想把self.A = createContent()
适合每一个地方需要A
这样命令我想问一下,如果有一个Python的方式如何时自动初始化变量例如其None
。 createContent
需要时间来处理,所以我不想把它放到每个命令都会执行的构造函数中。
如果初始化是昂贵的,因此,你只需要在需要时初始化变量,一个Python的方式是简单地try
使用它,如果失败,将其初始化。
例如:
try:
do_something(self.A)
except AttributeError:
self.A = initialize(self)
do_something(self.A)
您将需要包装的每一行代码,在一个情况下,你不能确定它是不是在这样一个try/except
块尚未定义使用A
。
另一种方法是每次像@Nsh提出的那样对A
进行明确检查。但是有人,无论是你还是Python,都必须在某个时候进行检查。
假设你的属性self.A
是某种静态的对象,我们可以使用property创建它按需实现:
class Something(object):
@property
def A(self):
try:
return self._A
except AttributeError:
self._A=CreateAnA()
return self._A
这样你就不需要重复检查。如果您需要这些操作,您可以添加setter等。不利的一面是,创建它时并不明显(因为它是读取属性的副作用),并且间接查找的性能损失稍微小一些(可以使用__getattr__
来避免,但以其他失败查找为代价) )。
由于上述建议,我想出了这个:
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()
你认为这是正确的/ Python的?
'__getattr__'会导致所有未定义的名称产生'None'。如果你没有找到任何东西,正常行为是引发'AttributeError'。 – 2014-10-30 14:10:48
这个问题很混乱。我认为我们需要更多的背景来了解你想要做什么,以及为什么这样做才是正确的做法。例如,什么样的对象是'self',你不能只用该对象的初始化方法来定义'A'? – 2014-10-30 07:49:04
我会尝试更好地展开它:我有一个对象,在对象的单一生命周期中,有时需要“A”,有时根本不需要。我不想使用对象的初始化方法,因为定义A很昂贵,并不总是需要。同时我不想检查它是否没有定义,并在需要'A'的所有地方定义它。 – user1600745 2014-10-30 08:19:36