华南俳烁实业有限公司

python

當前位置:中華考試網(wǎng) >> python >> python編程基礎 >> 文章內(nèi)容

掌握python訪問限制

來源:中華考試網(wǎng)  [2020年11月6日]  【

  說到訪問控制,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的值。

  接下來,試著反向驗證一下,在類的外部,能不能訪問其屬性,將上面代碼的輸出部分修改如下:

python課程免費試聽預約

  • 地區(qū):
  • 姓名:
  • 手機:

  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訪問限制的三種級別。

責編:fushihao
  • 會計考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學歷考試
太康县| 哈巴河县| 崇信县| 渝北区| 靖西县| 方正县| 忻城县| 彰化市| 河间市| 文昌市| 应城市| 麻阳| 昌黎县| 都昌县| 如东县| 临漳县| 莱州市| 万安县| 梁平县| 珲春市| 沿河| 镇坪县| 政和县| 包头市| 上栗县| 迁安市| 墨竹工卡县| 新化县| 安陆市| 酒泉市| 密山市| 图们市| 沁水县| 霞浦县| 永济市| 拜泉县| 兴隆县| 洪雅县| 涟水县| 西乌珠穆沁旗| 汉中市|