python訪問修飾符

權限訪問(僞權限,只是壓縮時按規則換了變量名,Python 的哲學是假定使用者都會使用)

_xx 以單下劃線開頭的表示的是protected類型的變量。即保護類型只能允許其本身與子類進行訪問。若內部變量標示,如: 當使用“from M import”時,不會將以一個下劃線開頭的對象引入 (成俗約定,不做限制)。

__xx 雙下劃線的表示的是私有類型的變量(private)。只能允許這個類本身進行訪問了,連子類也不可以用於命名一個類屬性(類變量),調用時名字被改變(在類FooBar內部,__boo變成_FooBar__boo,如self._FooBar__boo)

__xx__定義的是特列方法。用戶控制的命名空間內的變量或是屬性,如init , __import__或是file 。只有當文檔有說明時使用,不要自己定義這類變量。 (就是說這些是python內部定義的變量名)

##例

class A:
    __age = 18
print(dir(A()))
print(A()._A__age)

打印

['_A__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
18

__age變量名稱被壓縮成_A__age,外部使用該名稱調用即可

class A:
    def __fn(self):
        print(self.name)

class B(A):
    def pp(self, name):
        self.name=name
    # def _A__fn():
    #     print(self.name)

b=B()
b.pp('321')
print(dir(b)) #打印b實例的屬性與方法
b._A__fn()

打印

['_A__fn', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'pp']
321

可看出A類的fn()已被B類以新的名稱(_A__fn)繼承過來

實際相當於

class A:
    def __fn(self):
        print(self.name)

class B(A):
    def pp(self, name):
        self.name=name
    def _A__fn(self):
        print(self.name)

b=B()
b.pp('321')
print(dir(b))
b._A__fn()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章