2011-05-04 50 views
1

我碰到一段代码走到今天,看起来像这样:这是什么做的(Python)的

class ClassName(object): 
    def __init__(self): 
     self._vocabulary = None 

    def vocabulary(self): 
     self._vocabulary = self._vocabulary or self.keys() 
     return self._vocabulary 

究竟是什么线self._vocabulary = self._vocabulary or self.keys()干什么?

+1

代码片段的第一部分是无效的Python语法。 – 2011-05-04 19:25:26

+0

谢谢!现在不固定 – dave 2011-05-04 19:27:19

+1

不完全;我已经为你纠正了类声明。 – 2011-05-04 19:32:06

回答

8

这样一行:

self._vocabulary = self._vocabulary or self.keys() 

是所谓延迟初始化,如果你是第一次检索值它初始化。因此,如果它从未初始化,则self._vocabulary将为None(因为__init__方法已设置此值)导致or的第二个元素的评估,因此将执行self.keys(),将返回值指定为self._vocabulary,因此将其初始化以备将来使用要求。

当第二次调用vocabularyself._vocabulary将不会None它将保持该值。

+0

Upvoted,但它可以很好地阐明它是'__init__'中的明确行,它将'self._vocabulary'设置为'None',它不会自动发生。 – ncoghlan 2011-05-05 06:26:24

+0

@ncoghlan感谢您的投票和建议。我编辑了帖子,现在清楚了吗? – 2011-05-05 10:56:13

2

概括地说,如果self._vocabulary计算结果为逻辑假(例如,如果它是None0False等),那么它将被与self.keys()代替。

在这种情况下,or运算符将返回任何值计算为逻辑真。

而且,你的代码应该看起来更像是这样的:

class Example(object): 
    def __init__(self): 
     self._vocabulary = None 

    def vocabulary(self): 
     self._vocabulary = self._vocabulary or self.keys() 
     return self._vocabulary 

    def keys(self): 
     return ['a', 'b'] 

ex = Example() 
print ex.vocabulary() 
ex._vocabulary = 'Hi there' 
print ex.vocabulary() 
+0

啊,有道理。这是python独有的东西吗? – dave 2011-05-04 19:28:18

+0

'在这种情况下,or或运算符返回任何一个值为逻辑真的值。“ - 这是有点误导。如果'self._vocabulary'评估为'False',则执行'self.keys()'并将其用于赋值,无论它是否评估为“True”或“False”。请参阅http://stackoverflow.com/questions/1452489/evaluation-of-boolean-expressions-in-python/1452500#1452500,了解如何在布尔表达式中评估事物。 – MattH 2011-05-04 19:37:08

+0

@dave - 不,很多其他语言都有类似的操作符。例如,'||'运算符在ruby中执行相同的操作。在ruby中相当于'vocabulary || = keys()'或'vocabulary =(vocabulary || keys())'。除了ruby和python之外,它还有很多其他的语言。 – 2011-05-04 19:39:14

0

很难说,代码不会运行的原因有很多。为了猜测,我会说它看起来像它将被评估为一个逻辑表达式,self._vocabulary将被python评估为False,类型为None,并且self.keys()是一种将(也希望)返回要评估的方法。然后它只是两者之间的逻辑或,并且结果被输入self._vocabulary