python類的私有屬性和公共屬性

2021-08-20 03:31:24 字數 1850 閱讀 5368

對於python而言,類的屬性的可見度只有兩種,public和private。

類的私有屬性便是在前面加上「__」識別符號,而公共屬性則不必。

在類的外面訪問私有屬性會引發異常。

class base:

def __init__(self, value):

self.__value = value

b = base(5)

print(assert b.__value)

traceback (most recent call last):

file "/users/yangjiajia/desktop/project/python/algebra/test.py", line 19, in print(b.__value)

attributeerror: 'base' object has no attribute '__value'

屬性被私有化,即使繼承他的字類也不能訪問到。

class parent:

def __init__(self, value):

self.__value = value

class child(parent):

def get_value(self):

return self.__value

child = child(4)

print(child.get_value())

traceback (most recent call last):

file "/users/yangjiajia/desktop/project/python/algebra/test.py", line 24, in print(child.get_value())

file "/users/yangjiajia/desktop/project/python/algebra/test.py", line 21, in get_value

return self.__value

attributeerror: 'child' object has no attribute '_child__value'

為何會這樣?因為python會對類的私有屬性做些轉換,以保證private欄位的私密性。當編譯器看到child.get_value方法要訪問私有屬性時,他會先把__value變換為_child_value然後再進行訪問,但實際上該私有屬性是_parent__value。字類無法訪問父類的私有屬性,只是因為訪問的名稱不同。

查詢該物件的屬性字典便知

class parent:

def __init__(self, value):

self.__value = value

class child(parent):

def name(self):

names = 'yang'

def get_value(self):

return self.__value

child = child(4)

print(child.__dict__)

python開發的原則還是要少用私有屬性,如果需要保證屬性不重複,可以在其前面加上單個下劃線。

class parent:

def __init__(self, value):

self._value = value

class child(parent):

def get_value(self):

return self._value

child = child(4)

assert child._value == 4

Python 類的私有屬性和私有方法

xx 公有變數 xx 公有變數或方法,不能通過import匯入其他模組 只有模組內部使用 類物件和子類可以訪問 xx 私有變數或方法 偽私有 類外部不能直接訪問。xx 公有變數或方法,子類可以訪問。魔法方法或屬性 例如 init 不推薦這樣命名。xx 公有變數或方法。一般為了避免和python關鍵字...

python類私有屬性

python中沒有private關鍵字,想要建立乙個類私有的變數需要通過命名規則來實現 在變數名之前加兩個下劃線 name,則在類外部就不能直接通過例項.name訪問,具體原理python編譯器將其命名修改為了 類名 name,通過其實例項.類名 name還是可以訪問 class test obje...

python類的私有屬性和方法

python 對於類的成員沒有嚴格的訪問控制限制 關於私有 屬性和私有方法,有如下要點 兩個下劃線開頭的屬性是私有的 private 其他為公共的 public 類內部可以訪問私有屬性 方法 類外部不能直接訪問私有屬性 方法 外部可以通過 類名 私有屬性 方法 名 訪問私有屬性 方法 class s...