欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Ruby與Python的對(duì)象系統(tǒng)有什么區(qū)別

本篇內(nèi)容主要講解“Ruby與Python的對(duì)象系統(tǒng)有什么區(qū)別”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Ruby與Python的對(duì)象系統(tǒng)有什么區(qū)別”吧!

創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)全網(wǎng)整合營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、宜章網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站商城網(wǎng)站制作、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為宜章等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

屬性

屬性的嚴(yán)格定義不知道去哪里找, 這里暫且用來(lái)指對(duì)象實(shí)例用來(lái)儲(chǔ)存自身狀態(tài)的方式好了。 用途自然是儲(chǔ)存對(duì)象的協(xié)作者與數(shù)據(jù)等。 或者干脆說(shuō)成是: per-instance 的東西都叫屬性1

內(nèi)部訪(fǎng)問(wèn)

一般來(lái)說(shuō), 對(duì)象的內(nèi)部狀態(tài)輕易不向外暴露, 讀寫(xiě)操作主要由對(duì)象的方法完成。 這種自己默默修改自身屬性的存取方式我們暫時(shí)稱(chēng)作內(nèi)部訪(fǎng)問(wèn)。

Ruby 中為每個(gè)對(duì)象提供了單獨(dú)的命名空間來(lái)存放屬性, 語(yǔ)法上 @foo 是讀取,@foo = 'bar' 是寫(xiě)入。 而且讀寫(xiě)語(yǔ)義無(wú)法通過(guò)元編程來(lái)干擾。 也不與常量查找、方法調(diào)用、局部變量存取等尋址方式相沖突。

在 Python 中這種命名空間似乎也是存在的, 而且乍一看可以通過(guò) __dict__字典來(lái)訪(fǎng)問(wèn)2。 但由于打字太多, 實(shí)際恐怕很少有人積極使用, 更多地還是直接用外部訪(fǎng)問(wèn)的方法。 往下看。

外部訪(fǎng)問(wèn)

Ruby 默認(rèn)禁止外部直接訪(fǎng)問(wèn)對(duì)象屬性3, 需要我們顯式地在類(lèi)定義中使用attr系列方法 來(lái)顯式定義供外部使用的存取方法。

Python 這邊就容易得多, 自定義的 New Style Class 默認(rèn)有 __dict__ 屬性4, 讀寫(xiě)全開(kāi), 可以直接用 foo.barfoo.bar = 'baz' 語(yǔ)法存取, 內(nèi)部存取時(shí)多半也用這種語(yǔ)法。

這里我不想談及定義了 __slots__ 的情況, 因?yàn)榭次臋n里面一長(zhǎng)串需要當(dāng)心的 notes 可以猜測(cè)沒(méi)什么人愿意用。 稍微 Google 一下的結(jié)果也基本證實(shí)如此。

元編程:自定義 getter/setter

兩種語(yǔ)言都支持在語(yǔ)法上依然寫(xiě)出常規(guī)的屬性取值/賦值, 而背后執(zhí)行任意的代碼。 常用的場(chǎng)景包括延遲求值, 計(jì)算屬性(Calculated Attribute), 只讀屬性等。

在 Ruby 里由于語(yǔ)法糖實(shí)在太甜, 調(diào)用方法時(shí)可以省略掉括號(hào), 能夠不傳參數(shù)調(diào)用的方法就是 getter, 寫(xiě)起來(lái)像 foo.bar。 以 = 結(jié)尾的一元方法就是 setter, 通過(guò) foo.bar = 'baz' 就會(huì)調(diào)用到。 前面提到的 attr 系列方法 也只是按照這個(gè)接口來(lái)定義方法, 并非特殊的語(yǔ)言關(guān)鍵字。

至于 Python, 只需 getter 時(shí)還好說(shuō), 直接用 @property 裝飾器就好。 但需要允許外部只讀訪(fǎng)問(wèn)屬性時(shí)就有些麻煩。 讀寫(xiě)控制要由 property descriptor 來(lái)實(shí)現(xiàn), 為了自定義一個(gè)只讀 descriptor 寫(xiě)起來(lái)像這樣:

EDIT: 明顯下面的代碼是不對(duì)的, 當(dāng)時(shí)我在想什么。 還好真實(shí)世界中一般都用下劃線(xiàn)方案而不是用這種方案來(lái)滿(mǎn)足語(yǔ)義純化論者。

class Foo(object):
    bar = property()
    @bar.setter
    def bar(self, value):
        raise AttributeErrorFoo().bar = 'shit' # => 拋 AttributeError 異常

這樣在內(nèi)部訪(fǎng)問(wèn)中要寫(xiě)入屬性時(shí)就要被迫改用這種傷鍵盤(pán)的寫(xiě)法:self.__dict__['bar'] = 'blah'。 所以現(xiàn)實(shí)生活中人們往往用下劃線(xiàn)開(kāi)頭表達(dá)私有屬性, 然后定義一個(gè)去掉開(kāi)頭下劃線(xiàn)的 getter 來(lái)提供只讀訪(fǎng)問(wèn)了事。

+1 for Ruby

到這里已經(jīng)可以總結(jié)出我偏好 Ruby 的一點(diǎn)原因:

對(duì)屬性的內(nèi)部與外部存取做出明確區(qū)分, 默認(rèn)不提供外部直接存取。 且兩種存取方式的語(yǔ)法都不難寫(xiě)。 鼓勵(lì)開(kāi)發(fā)者在設(shè)計(jì)時(shí)考慮好封裝問(wèn)題。 而 Python 慣用的方式是下劃線(xiàn)標(biāo)識(shí)私有屬性, 難免會(huì)增加代碼量。

接下來(lái)如果再寫(xiě)下去要一并引入很多對(duì)象模型的重點(diǎn)問(wèn)題, 恐怕就要被標(biāo)記 TL;DR 了。 所以先到這吧。

  1. 未來(lái)談及方法解析的時(shí)候會(huì)引入 per-instance 的方法定義, 從而毀掉這個(gè)不嚴(yán)格的描述。

  2. 但是你沒(méi)法通過(guò)自定義 __dict__ 返回值來(lái)擾亂屬性專(zhuān)有字典。  是的, 在這兩種語(yǔ)言元編程的能力下, 可以做出很多出格的事情來(lái)。 本文只能在假設(shè)開(kāi)發(fā)者不會(huì)積極地亂來(lái)的基調(diào)下展開(kāi)討論。

  3. 當(dāng)然你可以用 instance_variable_{get,set,s} 等方法來(lái)訪(fǎng)問(wèn)。 避而不談的理由見(jiàn)另一個(gè)腳注。

  4. object 類(lèi)自己卻沒(méi)有定義 __dict__, 其實(shí)例也沒(méi)有。 所以盡管這樣一個(gè)空的 New Style Class class Foo(object): pass 是 object 的直接子類(lèi), 兩個(gè)類(lèi)的實(shí)例的行為卻大不相同。

到此,相信大家對(duì)“Ruby與Python的對(duì)象系統(tǒng)有什么區(qū)別”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

當(dāng)前標(biāo)題:Ruby與Python的對(duì)象系統(tǒng)有什么區(qū)別
文章鏈接:http://chinadenli.net/article18/gjoddp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)網(wǎng)站設(shè)計(jì)公司定制網(wǎng)站移動(dòng)網(wǎng)站建設(shè)建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司