91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Ruby和Python的方法調用有什么不同

發布時間:2021-11-26 11:34:28 來源:億速云 閱讀:132 作者:iii 欄目:大數據

本篇內容介紹了“Ruby和Python的方法調用有什么不同”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

Property -vs- Method

在 Python 的世界觀里, 對象被當作屬性的容器, 調用方可以在其上 get/set 屬性。 get/set 的邏輯可能是簡單的取值賦值, 也可能是通過 descriptor 實現的復雜邏輯。 所謂的 method 只是在查找 property 時返回了某種特殊的 callable object 而已。

Ruby 則遵從了 Smalltalk 的設計原則: 消息傳遞是對象與外界交流的唯一方式, 屬性賦值與取值都是語法糖偽裝下的方法調用。 僅此。

方法解析

解析一詞譯自 Resolution, 方法解析有時也稱作方法查找(Lookup)。 解析過程所要解決的問題是 “在接受方法調用時找到實際需要執行的代碼”。

由于 Python 對“屬性”及其 descriptor 概念的強調, 方法解析在 Python 里其實更應該稱作屬性解析。

從實例自身開始解析

Ruby 設計了 eigenclass, 使得每個實例都可以擁有一個只屬于自己的 class, 在其中定義屬于自己的方法, 在方法解析的過程中, eigenclass 的優先級也最高。 畢竟, 從消息傳遞的角度來看, 對象自主決定如何響應消息并不過分。

日常的應用開發中, 使用 eigenclass 最多的時候就是定義類方法。 還有一個常用技巧是把動態生成的方法緩存在里面。 Test double 庫更是會充分利用它定義每個實例的行為。

反觀 Python, 對于 Per-instance Polymorphism 的支持僅停留在實例屬性的基礎上。 或者說,實例自身只是單純的屬性容器。 如果你真心想玩, 把對象的__class__ 屬性改掉就可以啦。1

沿繼承結構解析

按照類的繼承結構查找方法是最為主要的方法查找路徑, 在學習這兩種語言的對象模型時, 都是重點需要理解的知識。

雖然 Ruby 使用 mixin, Python 用的是多繼承。 但兩種機制在功用上并沒有因此產生很大的差異。

當然特殊情況還是存在的: Python 允許開發者通過自定義 一個 class 的 metaclass 的 .mro() 方法來修改這個 class 的實例的方法解析路徑。 不清楚這個明顯改變方法查找順序的接口實際有多少應用。

此外, Python 對象實例的屬性查找順序與其 class 的屬性查找順序有明顯的交叉。 語義上僅屬于 class 的 staticmethod 與 classmethod 都會出現在實例的屬性查找路徑上。 也許這是為了方便使用多半以 utility function 身份存在的 staticmethod, 但也意味著你不能讓 class method 與 instance method/property 重名。 Seriously,在實例上能取到 class method 不管怎么解釋也實在是太奇怪了啊。

解析失敗時的 fallback

Python 有 __getattr__ 這個機會在解析失敗時由開發者自行返回一個屬性。 相應地 Ruby 有 method_missing, 但需要返回方法調用的結果而不是單純的查找。 這明顯是 message passing 模式下的產物: 你需要對 message 做出響應, 而不是關注屬性/方法這些概念。

此外 Python 還可以在查找前就調用 __getattribute__ / __setattr__, 這也是一個 catch-all 的機會。 哦對了,__getattribute__ 能夠截獲所謂”special attributes”(如__dict__)的查找, 而 __getattr__ 則不能。

這方面單純從語言能力上來看,Ruby 似乎要更弱一些的樣子。 但只提供查找失敗的 catch-all 就已經足夠實現“響應任意方法調用”。 以及,有人記住 Python 那些個 special attributes 了么? 這種語法上沒有區別但背后邏輯隱隱地不同的設計, 要么去死記記住, 要么就等著掉坑吧。

方法綁定與調用

終于說完了方法解析, 接下來的過程就變得簡單了。 所謂綁定只是讓未綁定的方法確定調用時 self 的指向。 印象中有時也稱作 context。

在 Python 的方法定義語法看來, 綁定 self 很像是為函數綁定了首個參數。 不知道和所謂的 currify 是不是一回事。 乃至,調用的時候如果傳入參數的數量不對, Python 拋出的異常的信息里還會把 self 的占位算進去, 有效地擾亂你的 debugging。 Ruby 當然不存在這種問題。

以及, 由于對“消息傳遞”的強調, Ruby 不像 Python 可以省略調用時的括號直接返回一個已綁定的 method, 而是必須要用另一個方法 Object#method 來實現。

換個角度來看, Python 在這里讓語法-語義變得復雜, Ruby 則選擇把這種底層邏輯塞進一個貌似無辜的方法里。 于是 Ruby 才能夠做到“方法調用時可以省略括號”。 就是因為 Ruby 不依賴復雜的語法來表達語義, 才可以給更多的語法糖讓出空間。

“Ruby和Python的方法調用有什么不同”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岚皋县| 朝阳市| 惠州市| 托克逊县| 白河县| 新宾| 沐川县| 苍山县| 临泉县| 安塞县| 康马县| 林甸县| 茂名市| 永登县| 苍山县| 毕节市| 达孜县| 佛坪县| 宽甸| 班戈县| 河东区| 孝义市| 金门县| 德庆县| 桂阳县| 竹山县| 潜山县| 常山县| 三河市| 山阳县| 南丹县| 林甸县| 泾川县| 大田县| 班玛县| 光山县| 辉南县| 罗甸县| 铅山县| 蓝田县| 蛟河市|