2011-05-04 85 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