說到訪問控制,python小白可能會很陌生。那就舉一個簡單的例子,我們住的房子是私有物,而外面的公共設施是公有物。這樣是不是好理解一點了呢?
訪問控制有三種級別:私有、受保護、公有
私有(Private):只有類自身可以訪問
受保護(Protected):只有類自身和子類可以訪問
公有(Public):任何類都可以訪問
一、公有(Public)
在Python的類中,默認情況下定義的屬性都是公有的。
class Foo(object):
bar = 123
def __init__(self, bob):
self.bob = bob
print(Foo.bar) # 123
foo = Foo(456)
print(foo.bob) # 456
上面類Foo中的bar屬性就是類屬性,init方法中定義的bob是實例屬性,bar和bob都是公有的屬性,外部可以訪問,分別print類中的bar和實例中的bob,輸出了對應的值。
二、受保護(Protected)
在Python中定義一個受保護的屬性,只需要在其名字前加一個下劃線_,我們將Foo方法中的bob和bar改為_bob和_bar,他們就變成了受保護的屬性了,代碼如下:
class Foo(object):
_bar = 123
def __init__(self, bob):
self._bob = bob
class Son(Foo):
def print_bob(self):
print(self._bob)
@classmethod
def print_bar(cls):
print(cls._bar)
Son.print_bar() # 123
son = Son(456)
son.print_bob() # 456
定義一個類Son繼承自Foo,由于受保護的對象只能在類的內(nèi)部和子類中被訪問,不能直接調(diào)用print(Son._bar)或print(son._bob)來輸出這兩個屬性的值,所以定義了print_bar和print_bob方法,實現(xiàn)在子類中輸出,這段代碼也正常的輸出了_bar和_bob的值。
接下來,試著反向驗證一下,在類的外部,能不能訪問其屬性,將上面代碼的輸出部分修改如下:
print(Son._bar) # 123
son = Son(456)
print(son._bob) # 456
(假裝)驚訝的發(fā)現(xiàn),竟然沒有報錯,也輸出了正確的值。
Python中用加下劃線來定義受保護變量,是一種約定的規(guī)范,而不是語言層面真的實現(xiàn)了訪問控制,所以,我們定義的保護變量,依然可以在外部被訪問到(這是個feature,不是bug)。
三、私有(private)
Python定義私有屬性,需要在屬性名前加兩個下劃線__,把上面的代碼修改一下,運行一下會發(fā)現(xiàn)下面的代碼中的任何一個print都會報錯的。
class Foo(object):
__bar = 123
def __init__(self, bob):
self.__bob = bob
class Son(Foo):
def print_bob(self):
print(self.__bob) # Error
@classmethod
def print_bar(cls):
print(cls.__bar) # Error
print(Son.__bar) # Error
son = Son(456)
print(son._bob) # Error
以上就是python訪問限制的三種級別。
初級會計職稱中級會計職稱經(jīng)濟師注冊會計師證券從業(yè)銀行從業(yè)會計實操統(tǒng)計師審計師高級會計師基金從業(yè)資格稅務師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價格鑒證師統(tǒng)計資格從業(yè)
一級建造師二級建造師消防工程師造價工程師土建職稱房地產(chǎn)經(jīng)紀人公路檢測工程師建筑八大員注冊建筑師二級造價師監(jiān)理工程師咨詢工程師房地產(chǎn)估價師 城鄉(xiāng)規(guī)劃師結(jié)構工程師巖土工程師安全工程師設備監(jiān)理師環(huán)境影響評價土地登記代理公路造價師公路監(jiān)理師化工工程師暖通工程師給排水工程師計量工程師
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護士資格證初級護師主管護師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗技師臨床醫(yī)學理論中醫(yī)理論