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

溫馨提示×

溫馨提示×

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

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

Python類定義有哪些作用

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

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

The Class Scope

Ruby class 的作用域有以下幾個作用:

  • 定義方法。在其實例(或其子類的實例)查找方法時提供方法定義

  • 存放常量的容器。可以通過 ClassName::CONST 的語法訪問常量

  • 作為一個普通的作用域,其中也可以存放局部變量什么的。但無法被外界直接訪問到。

從這些功用來看, Ruby 與 Python 的 class scope 似乎沒什么區別。 只是 Python 對于常量不做特別對待而已。 但是, 下面的這些差異才是重點:

Before -vs- After

當你可以在 Ruby 的 class scope 里寫代碼時, 這個 class 自身就已經被實例化了。 你可以在定義 class 的過程中調用這個 class 的方法。 或者用 Smalltalk 的方式來說:向 class 發送消息。 所以我們才能看到 Sinatra、Rails Model 這些簡單優雅的 DSL。

相比之下, Python 的 class scope 存在于 class 被實例化之前, 定義結束時, scope 這個字典連同聲明超類的 tuple 一起傳入給 metaclass 用以完成類的構建。

Python 要想做到 attr_accessor :foo, :bar 這么簡單的事情, 充其量只能在 model 層面引入特殊的 property descriptor constructor, 而且為了填充作用域還不得不 repeat yourself。 自省 call stack 修改作用域這種糟糕的方案我還是不太敢用。 每次顯式地把 locals() 傳出去打字又太多。 所以有生之年真的不要指望 Python 以 OO 為基礎設計出優雅且實用的 internal DSL 了。

Reopening Class

Ruby class 的又一個巨大優勢: 可以隨時再度打開并加以修改。 因此你可以為舊有的 class 增減方法, 可以為其補充 mixin。 這里有個小小的 caveat 是: Class scope 里定義的局部變量在每次 reopen 時是獨立的, 無法互訪。

這里 Python 就只能悲劇了: 多繼承關系與初始 class scope 是由 metaclass 一次性定義完成的, 沒有正當的修改機會。 刪除舊有的方法定義倒是簡單:del cls.method 即可。 添加方法就很費勁: 沒有 code block 語法, lambda 表達式不能寫多條語句, 別忘了還得留第一個參數的位置作為 self

因此大體上可以斷言: Python 的 class 在定義之后基本上是靜態的。 不方便也不推薦用黑魔法修改其定義。

Decorator -vs- Redefining Method

Decorator 是 Python 語法中強大的存在, 很多現代的 library 都充分地使用它。 在類定義中也時常可見。 比如內置的 property()

然而, 在定義類的時候, decorator 的作用非常之小, 并沒有比 property descriptor constructor 強多少。 畢竟 decorator 只是為 function composition 而非 OOP 設計的。

內置的 decorator 里, 無法取代但又非常惱人的當屬 staticmethod /classmethod。 定義出來的方法同時會出現在實例和類的屬性查找路線上。

Ruby 沒有 decorator, 但可以利用前面提到的 class scope 持久化的特點, 把舊的方法定義取出來, 加以包裝后再重新定義。 參見 Rails Controller 中 filter的聲明方式。

另外, 事實上有人已經在 Ruby 中實現了縮水版的 decorator。 不過似乎也沒有得到廣泛應用就是了。

Class of Class

Python 里有專門的 metaclass 用來表達“實例化后可以產出 class 的 class”。 Ruby 則沒有這種特別的概念。 但實際使用起來, Python 的 metaclass 更像是 decorator: 預處理一下超類 tuple 和 class scope 里的內容, 最終把處理后的東西傳給 type() 而已。

還有一個值得注意的問題是, Metaclass 構建生成的 class, 其屬性查找的過程可能會較為迷茫。

相比之下, 這種語言能力在 Ruby 里也存在但很少用得到。 Metaclass 的實用場景多半在于“按照庫 / 框架的要求定義模板式的 class”。 這種需求用inherited / included hook 加上前面提到的 reopening class 的能力就可以輕易地做到了。 不多談。

“Python類定義有哪些作用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

AI

张掖市| 都江堰市| 商都县| 五常市| 瑞丽市| 疏附县| 澄迈县| 五家渠市| 天水市| 绥中县| 陕西省| 梅州市| 白山市| 剑川县| 苍南县| 临夏县| 象山县| 金堂县| 墨江| 平谷区| 上高县| 伊川县| 冕宁县| 安康市| 班玛县| 孟村| 乌鲁木齐市| 中宁县| 马关县| 巴东县| 九江县| 望奎县| 和田市| 博白县| 东丰县| 博野县| 静宁县| 开化县| 莎车县| 巴彦淖尔市| 锦屏县|