您好,登錄后才能下訂單哦!
本篇內容介紹了“Python類定義有哪些作用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Ruby class 的作用域有以下幾個作用:
定義方法。在其實例(或其子類的實例)查找方法時提供方法定義
存放常量的容器。可以通過 ClassName::CONST
的語法訪問常量
作為一個普通的作用域,其中也可以存放局部變量什么的。但無法被外界直接訪問到。
從這些功用來看, Ruby 與 Python 的 class scope 似乎沒什么區別。 只是 Python 對于常量不做特別對待而已。 但是, 下面的這些差異才是重點:
當你可以在 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 了。
Ruby class 的又一個巨大優勢: 可以隨時再度打開并加以修改。 因此你可以為舊有的 class 增減方法, 可以為其補充 mixin。 這里有個小小的 caveat 是: Class scope 里定義的局部變量在每次 reopen 時是獨立的, 無法互訪。
這里 Python 就只能悲劇了: 多繼承關系與初始 class scope 是由 metaclass 一次性定義完成的, 沒有正當的修改機會。 刪除舊有的方法定義倒是簡單:del cls.method
即可。 添加方法就很費勁: 沒有 code block 語法, lambda
表達式不能寫多條語句, 別忘了還得留第一個參數的位置作為 self
。
因此大體上可以斷言: Python 的 class 在定義之后基本上是靜態的。 不方便也不推薦用黑魔法修改其定義。
Decorator 是 Python 語法中強大的存在, 很多現代的 library 都充分地使用它。 在類定義中也時常可見。 比如內置的 property()
。
然而, 在定義類的時候, decorator 的作用非常之小, 并沒有比 property descriptor constructor 強多少。 畢竟 decorator 只是為 function composition 而非 OOP 設計的。
內置的 decorator 里, 無法取代但又非常惱人的當屬 staticmethod
/classmethod
。 定義出來的方法同時會出現在實例和類的屬性查找路線上。
Ruby 沒有 decorator, 但可以利用前面提到的 class scope 持久化的特點, 把舊的方法定義取出來, 加以包裝后再重新定義。 參見 Rails Controller 中 filter的聲明方式。
另外, 事實上有人已經在 Ruby 中實現了縮水版的 decorator。 不過似乎也沒有得到廣泛應用就是了。
Python 里有專門的 metaclass 用來表達“實例化后可以產出 class 的 class”。 Ruby 則沒有這種特別的概念。 但實際使用起來, Python 的 metaclass 更像是 decorator: 預處理一下超類 tuple 和 class scope 里的內容, 最終把處理后的東西傳給 type()
而已。
還有一個值得注意的問題是, Metaclass 構建生成的 class, 其屬性查找的過程可能會較為迷茫。
相比之下, 這種語言能力在 Ruby 里也存在但很少用得到。 Metaclass 的實用場景多半在于“按照庫 / 框架的要求定義模板式的 class”。 這種需求用inherited
/ included
hook 加上前面提到的 reopening class 的能力就可以輕易地做到了。 不多談。
“Python類定義有哪些作用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。