2014-10-30 166 views
0

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

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

现在我不想把self.A = createContent()适合每一个地方需要A这样命令我想问一下,如果有一个Python的方式如何时自动初始化变量例如其NonecreateContent需要时间来处理,所以我不想把它放到每个命令都会执行的构造函数中。

+1

这个问题很混乱。我认为我们需要更多的背景来了解你想要做什么,以及为什么这样做才是正确的做法。例如,什么样的对象是'self',你不能只用该对象的初始化方法来定义'A'? – 2014-10-30 07:49:04

+0

我会尝试更好地展开它:我有一个对象,在对象的单一生命周期中,有时需要“A”,有时根本不需要。我不想使用对象的初始化方法,因为定义A很昂贵,并不总是需要。同时我不想检查它是否没有定义,并在需要'A'的所有地方定义它。 – user1600745 2014-10-30 08:19:36

回答

1

hasattr怎么样?

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

如果初始化是昂贵的,因此,你只需要在需要时初始化变量,一个Python的方式是简单地try使用它,如果失败,将其初始化。

例如:

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

您将需要包装的每一行代码,在一个情况下,你不能确定它是不是在这样一个try/except块尚未定义使用A

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

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__来避免,但以其他失败查找为代价) )。

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() 

你认为这是正确的/ Python的?

+0

'__getattr__'会导致所有未定义的名称产生'None'。如果你没有找到任何东西,正常行为是引发'AttributeError'。 – 2014-10-30 14:10:48