在其他語言中,屬性以_開頭一般用於表示這個屬性是私有屬性,不能在外部訪問。
在python中是不存在私有屬性這種說法的。以_開頭的屬性,只是表名是私有屬性,和api的呼叫沒有關係。但是也是可以呼叫的
classa():def __init__(self):
self._private= "am i private?"a=a()print(a._private)
# 結果
# 『am i private?』
以_ _開頭的屬性,可以實現私有的功能。但它真正的用途是防止子類重寫該屬性。
classa():def __init__(self):
self.__private = "am i private?"a=a()print(a.__private)# traceback (most recent call last):
# file "e:/www/py3/test/config.py", line 7, in
# print(a.__private)
# attributeerror: 'a' object has no attribute '__private'
_ _private屬性依舊可以被訪問。以上的呼叫報錯的原因,是呼叫錯了名字。
_ _實現防止子類重寫的原理,其實就是給屬性改乙個名字。
我們用dir()函式可以看到
classa():def __init__(self):
self.__private = "am i private?"a=a()print(dir(a))#['_a__private', '__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__']
這個'_a__private'其實就是__private。為了防止複寫,給他改了個名字(總覺得這種處理方式有點萌哈哈哈哈)
所以如果想呼叫,甚至修改,只需要呼叫 a._a__private
但是別這麼做啊!!!!
classa():def __init__(self):
self.__private = "am i private?"
deffunc(self):print(self.__private)
a=a()
a.func()
a._a__private= 'nonono'a.func()#am i private?#nonono
「is」和「 」的區別 Python
is用來檢查物件的標識 id id 函式用於獲取物件記憶體位址,而 用來檢查兩個物件引用的變數的值是否相等。通過乙個例子說明。建立一些列表並將其分配給不同的名字。請注意,下面的b指向與a相同的物件 a 1 2,3 b a c 1,2,3 下面來檢查是否相等,你會注意到結果顯示它們都是相等的。prin...
python 和is的區別
python中物件包含的三個基本要素,分別是 id 身份標識 type 資料型別 和value 值 是python標準操作符中的比較操作符,用來比較判斷兩個物件的value 值 是否相等 is也被叫做同一性運算子,這個運算子比較判斷的是物件間的唯一身份標識,也就是id是否相同 舉例 x y 4,5,...
python 和 的區別
相同點 和 都是用於求和 連線運算的 不同點 對於可變物件來說 和 是不一樣的 set和dict沒有這兩個操作 可變物件 相當於對原物件 之後產生乙個新物件 可變物件 相當於修改原物件內部的值,並沒有修改原物件,也就是修改前後物件的記憶體位址不變 id 記憶體位址的整數表示 示例 如下所示 ls 1...