国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

8.5 在類中封裝屬性名

2018-02-24 15:26 更新

問(wèn)題

你想封裝類的實(shí)例上面的“私有”數(shù)據(jù),但是Python語(yǔ)言并沒(méi)有訪問(wèn)控制。

解決方案

Python程序員不去依賴語(yǔ)言特性去封裝數(shù)據(jù),而是通過(guò)遵循一定的屬性和方法命名規(guī)約來(lái)達(dá)到這個(gè)效果。第一個(gè)約定是任何以單下劃線_開(kāi)頭的名字都應(yīng)該是內(nèi)部實(shí)現(xiàn)。比如:

class A:
    def __init__(self):
        self._internal = 0 # An internal attribute
        self.public = 1 # A public attribute

    def public_method(self):
        '''
        A public method
        '''
        pass

    def _internal_method(self):
        pass

Python并不會(huì)真的阻止別人訪問(wèn)內(nèi)部名稱。但是如果你這么做肯定是不好的,可能會(huì)導(dǎo)致脆弱的代碼。同時(shí)還要注意到,使用下劃線開(kāi)頭的約定同樣適用于模塊名和模塊級(jí)別函數(shù)。例如,如果你看到某個(gè)模塊名以單下劃線開(kāi)頭(比如_socket),那它就是內(nèi)部實(shí)現(xiàn)。類似的,模塊級(jí)別函數(shù)比如 sys._getframe() 在使用的時(shí)候就得加倍小心了。

你還可能會(huì)遇到在類定義中使用兩個(gè)下劃線(__)開(kāi)頭的命名。比如:

class B:
    def __init__(self):
        self.__private = 0

    def __private_method(self):
        pass

    def public_method(self):
        pass
        self.__private_method()

使用雙下劃線開(kāi)始會(huì)導(dǎo)致訪問(wèn)名稱變成其他形式。比如,在前面的類B中,私有屬性會(huì)被分別重命名為 _B__private_B__private_method 。這時(shí)候你可能會(huì)問(wèn)這樣重命名的目的是什么,答案就是繼承——這種屬性通過(guò)繼承是無(wú)法被覆蓋的。比如:

class C(B):
    def __init__(self):
        super().__init__()
        self.__private = 1 # Does not override B.__private

    # Does not override B.__private_method()
    def __private_method(self):
        pass

這里,私有名稱 __private__private_method被重命名為 _C__private_C__private_method ,這個(gè)跟父類B中的名稱是完全不同的。

討論

上面提到有兩種不同的編碼約定(單下劃線和雙下劃線)來(lái)命名私有屬性,那么問(wèn)題就來(lái)了:到底哪種方式好呢?大多數(shù)而言,你應(yīng)該讓你的非公共名稱以單下劃線開(kāi)頭。但是,如果你清楚你的代碼會(huì)涉及到子類,并且有些內(nèi)部屬性應(yīng)該在子類中隱藏起來(lái),那么才考慮使用雙下劃線方案。

還有一點(diǎn)要注意的是,有時(shí)候你定義的一個(gè)變量和某個(gè)保留關(guān)鍵字沖突,這時(shí)候可以使用單下劃線作為后綴,例如:

lambda_ = 2.0 # Trailing _ to avoid clash with lambda keyword

這里我們并不使用單下劃線前綴的原因是它避免誤解它的使用初衷(如使用單下劃線前綴的目的是為了防止命名沖突而不是指明這個(gè)屬性是私有的)。通過(guò)使用單下劃線后綴可以解決這個(gè)問(wèn)題。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)