2017-07-08 51 views
-1

Python從哪裏借用了descriptor的概念?Python從哪裏借用描述符的概念?

Python是否從其他一些編程語言借用它?在C#中,我只看到屬性,而沒有描述符。

通過學習其他語言,而不是直接學習Python,我是否會受益於不僅僅是描述符而是其他概念?

+0

C#有一個ExpandoObject。然而,沒有「真實」的描述符相當於允許一般對象動態地攔截「任何」成員訪問。 – user2864740

+0

https://stackoverflow.com/questions/2865865/are-there-equivalents-to-rubys-method-missing-in-other-languages - 雖然略有不同的扭曲,「缺少方法」可以用描述符來實現(儘管反過來並不嚴格)。鏈接的問題包含許多可能提供見解的不同語言/實現的答案。 – user2864740

+0

所以:1.地點(很難找到一個權威的答案,這使得這不是一個好問題)2.是的(很難說Python的發展是在真空中發生的,而且很難找到任何客觀的答案)3.可能(這是主觀的,不是一個特別好或有趣的問題) – user2864740

回答

4

從Python本身。引用Guido Van Rossum 1,描述符是在Python 2.2中引入的,作爲綁定方法概念的概括,這是在以前版本中實現經典類的核心。

語言支持功能和麪向對象編程有兩種常用的方法。每個可調用方法都是一種方法,函數只是隱藏類的方法,這是Ruby採用的方法;或者每個可調用函數都是一個函數,而對象方法只是帶有隱式或顯式參數的函數,該函數接收調用該方法的對象,這是Python採用的方法。

在Python 2.1和之前的版本中,當實例屬性查找在實例字典中失敗時,解釋器會遞歸地查看類和基類。如果在類字典中找到該屬性並且它是一個函數,則解釋器將其包裝在可調用對象中,該對象在被調用時插入實例本身作爲第一個參數。包裝將實例綁定到函數,因此名稱綁定方法。

描述符是該行爲的概括。在Python 2.2和更高版本中,解釋器以相同的方式執行屬性查找,並且當在類字典中找到該屬性並且該方法有一個__get__方法時,將使用類和實例作爲參數調用此方法,並且返回任何內容被用作屬性搜索的結果。綁定方法包裝器現在只是一個實現__get__方法的普通對象,而不是一個特殊對象,允許我們定製它並實現特殊方法,如classmethodstaticmethod。最重要的是,我們有補充方法__set____delete__,概括了相同的行爲進行分配和刪除,允許我們實現諸如property和各種託管屬性。

+0

謝謝。 (1)在Python中,「一切都是功能」?一個類是一個函數,是一個函數類型,...? (2)「語言支持功能和麪向對象編程有兩種常見方法。」 Scala支持功能和麪向對象編程的方法是什麼? Java的方法是什麼? C#的? – Tim

+0

我認爲佩德羅正在嘗試做出關於可調用的聲明,並且最終方法是否建立在函數上,或者函數是建立在方法上的,但是它有點損壞。並非所有的Python都是一個函數,但方法的概念是建立在函數之上的(函數實現描述符協議,所以如果你在一個類上定義了一個,那麼當你從一個實例中訪問它時,它將自己作爲一個綁定方法返回)。 – ShadowRanger

+0

@Tim不好的選擇。我編輯了這個問題,以澄清我說的是可馴化的東西,而不是語言中的每個實體。至於你的評論中的其他問題,如果你爲此創建了一個新問題會更好,問Scala,Java,C#等究竟是如何實現它的。 –