2014-04-02 37 views
1

在Python中,我們說一切都是對象,查詢有關python控制流語句和lambda EXP

例如:表達x<y內部調用x.__lt__(y)

其中__lt__是方法類的對象(「INT '說,如果值是2 & 3)和x和y是參考變量的對象

用戶定義的功能square(3)內部呼叫square.__call__(3) 其中'square'是類'function'的對象的名稱,引用變量'square'指向該對象名稱'square'。

所以,

如何,如果 - elif的,否則,對,休息,繼續傳球,拉姆達報表內部解釋?作爲對象?

如果是,您可以舉一些例子以類似的方式進行可視化嗎?

回答

5

語句在Python中不表示爲對象(包括您提供的示例)。相反,事情的工作方式是語言語法經常映射到「鉤子」,您可以定義它來影響語法在特定情況下的功能。例如,<語法映射到__lt__掛鉤。這並不意味着<符號「是一個對象」;它只是意味着您可以在對象上定義方法來定製它們如何使用該語法。

您詢問的一些語法可以通過魔術方法以類似的方式受到影響。

if檢查其條件是否爲布爾值真。即,if x:內部呼叫bool(x)以確定x「計數」爲真還是假。您可以通過定義__nonzero__方法(或Python 3中的__bool__)來影響此決定。 elif的工作方式相同。 (您不能更改else所做的操作。)另外,當然,很多if條件涉及比較,您可以按照您已提及的方式自定義這些比較。例如,如果你想自定義if myObject < 2的工作方式,你可以編寫一個神奇的方法__lt__

for從事iterator protocol。您可以通過定義__iter__和/或next方法來使自己的對象可迭代。您不能完全影響breakcontinue,但您可以通過跳過元素來編寫「假」繼續的迭代器,或者通過提高StopIteration來編寫「假」繼續。

lambda只是用於定義函數的另一種語法。您無法更改lambda的功能,但不清楚這點到底會是什麼。

pass是一個無所事事的聲明。你不能改變它的作用,而且確實沒有意義:它無處不在。

+0

BrenBarn我寫錯了我的問題,我現在編輯。我還沒有閱讀你的答案): – overexchange

+0

Bren你可以編輯你的答案---'但這兩個例子都不是你提到的。相反,在Python中工作的方式是語言語法經常映射到您可以定義的「鉤子」 - 在我編輯我的問題後,這對我來說看起來不太合適,對於不便,我很抱歉 – overexchange

+0

@Sham:我沒有看到你的編輯改變了你的問題的實質。你是說我的回答不正確或不回答這個問題嗎?我不明白你在評論中的意思。 – BrenBarn