一、私有化
'''以雙下劃線開頭,以雙下劃線結尾的,python自帶的,已經擁有特殊的含義
自己屬性或者函式不能這樣命名
'''class tsg: _a = 1
__b = 2
def
_fun(self): print('如果人睡覺是為了做夢') def
__fun2(self): return ('那我寧可不睡覺')s = tsg()print(s._a)s._fun()print(s._tsg__b) #例項._類名__私有屬性 可以訪問雙下劃線的私有屬性
print(s._tsg__fun2())
二 、構造方法:__init__( ) 析構方法 :__del__( ) class face: # 類的構造器/類的初始化 __init__ 方法,例項化的時候自動執行def
__init__(self
,yourname,yourage,your***): self.name = yourname self.age = yourage self.*** = your*** #類的析構器 將物件刪除以釋放記憶體,一般放在末尾,類執行完的時候自動刪除物件
def
__del__(self): print('%s已死,有事說事,沒事多燒紙'%self.name)s = face('張三'
,'250'
,'去過泰國')
結果:張三已死,有事說事,沒事多燒紙
三、字串的展示 1:對使用者友好的:__str__( ) 2: 對開發者友好的:__repr__( )
class adidas: def__init__(self
,stunum,stuname,stubanji): self.num = stunum self.name = stuname self.banji = stubanji def
__str__(self): return
'我叫'+self.name+'學號是'+self.num+'是'+self.banji+'的學生'
a = adidas('123456','jim'
,'錢學森實驗1班')print(str(a))print(repr(a))
結果:我叫jim學號是123456是錢學森實驗1班的學生 #此行是str列印的結果<__main__.adidas object at 0x000001ecb379f940> #此行是繼承的object的預設repr列印的結果,返回 的是乙個類似記憶體位址的物件
兩點注意:
1、在普通的idle中 repr和str共存的話,那麼str的優先順序高於repr,程式預設執行str而不去執行repr
而在shell指令碼模式或者稱為互動模式下的話,只有repr,這就是為什麼在shell中輸入變數名就能列印 結果的原因
2、對於程式設計師來說我可能已經知道要列印什麼結果或者說是已經測試過了,所以我就沒有必要用str,這 樣還能節省不必要的文字記憶體花銷
四、屬性操作的內建函式 設定屬性 setattr() 獲取屬性 getattr() 歸屬問題的判斷hasattr( ) 刪除屬性 delattr()
class test: a = 'abc'b = 123
def
fun(self
,thing): self.thing = thing print(self.thing)t = test() #例項化物件t
#1、歸屬問題的判斷,存在列印99乘法口訣
if hasattr(t,
'a'): #返回bool值,
for i in
range(1
,10): for j in
range(1
,i+1): print('%s * %s = %2s'%(i,j,i*j),
end = ' ') print(' ')#2、為t設定m屬性,然後m的歸屬問題判斷,存在就列印第10次斐波那契數列
setattr(test,
'm',
20)if
hasattr(t,
'm'): a = 0
b = 1
for i in
range(10): a,b = a+b,a print(a)#3、查詢屬性值,查出屬性m的值,並將其分解因數num = getattr(t,
'm') #三個引數,查詢例項屬性,最後乙個引數表示,如果查到了就返回原值,反之則返回最後乙個引數
while num != 1: for i in
range(1
, num + 1): if (num % i) == 0
and i != 1: num = num // i if num == 1: print (" %d"%i,
end = ' ') else: print (" %d*"%i,
end = ' ') break
#查詢和設定的巢狀使用
print(getattr(t,
'c',
setattr(t,
'c',
456)))#4、刪除物件屬性
delattr(test,
'a') #兩個引數,例項或者類名, 例項不能刪除共有的屬性,類不能刪除例項屬性
print(hasattr(t,
'a'))
結果:1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
以上不是亂碼,是地方太小放不下
2* 2* 5 456
false
其他特殊的屬性:__name__ __class__ __doc__ __dict__
在如上**中加入
第一,__name__的使用從#1前邊一行加入(檔名為has_test)
if __name__ == '__main__':
(後邊對應縮排)
後邊的程式**只有在當前也就是名為has_test的檔案下執行才會被執行
當我用另外乙個名為specialatrribute.py的檔案呼叫剛才has_test時,後邊的**並不會被執行
from has_test import test
class a:
pass
if __name__ == '__main__':
print(test.__name__)
結果只有乙個test
#2、__class__的使用
from has_test import test t = test()print(t.__class__)
結果
(和type類似,但是類的__class__還是__class__)
#3、__doc__ 對class的文字標註
class c:
'''這只是乙個小測試
auther:flexin_
data:2018.3.24
'''pass
print(c.__doc__)
結果:
這只是乙個小測試
auther:flexin_
data:2018.3.24
#4、__dict__ 儲存物件(例項)屬性的字典
class d:
def __init__(self,a,b,c):
self.a = a
self.b = b
self.c = c
d = d(1,2,3)
print(d.__dict__
結果: python私有化方法 Python 私有化
python中的私有變數和私有方法仍然是可以訪問的 訪問方法如下 私有變數 例項.類名 變數名 私有方法 例項.類名 方法名 python並沒有真正的私有化支援,但可用下劃線得到偽私有。盡量避免定義以下劃線開頭的變數 1 單下劃線 開始的成員變數叫做保護變數,意思是只有類例項和子類例項能訪問到這些變...
Python特性 屬性以及私有化
特性是物件內部的變數 物件的狀態由它的特性來描述,物件的方法可以改變它的特性 可以直接從物件外部訪問特性 定義 class person name yoda 類中特性 defget name self 通過訪問器方法訪問特性 return self.name defset name self,val...
Python中私有化以及property的使用
第一種方式 class test object def init self self.num 100 get num函式專門用來獲取 num屬性值 defget num self return self.num set num函式專門用來設定 num屬性值 defset num self,new n...