_ getattr_()
當呼叫乙個不存在的屬性時,就會觸發__getattr__()
class
foo:
x =1def
__init__
(self, y)
: self.y = y
def__getattr__
(self, item)
:print
("執行__getattr__()"
)print
("不存在"
,item)
f1 = foo(10)
print
(f1.x)
#呼叫存在的屬性不會觸發__getattr__()
f1.dsa#因為dsa屬性不存在,所以會觸發__getattr__(),將f1傳給self,dsa傳給item
_ delattr_()
刪除乙個屬性的時候會觸發__delattr__()
class
foo:
x =1def
__init__
(self, y)
: self.y = y
def__getattr__
(self, item)
:print
("執行__getattr__()"
)print
("不存在"
, item)
def__delattr__
(self, item)
:print
("執行__delattr__()"
)#del self.item 這樣寫會進入死遞迴
self.__dict__.pop(item)
#這是刪除操作的本質
f1 = foo(10)
del f1.y
_ setattr_()
在改動屬性或新增屬性的時候會觸發__setattr__()
class
foo:
x =1def
__init__
(self, y)
: self.y = y
def__getattr__
(self, item)
:print
("執行__getattr__()"
)print
("不存在"
, item)
def__delattr__
(self, item)
:print
("執行__delattr__()"
) self.__dict__.pop(item)
def__setattr__
(self, key, value)
:print
("執行__setattr__()"
) self.key = value#這樣寫會進入死遞迴
self.__dict__[key]
= value
f1 = foo(
10)
這些雙下劃線開頭的方法都是類內建的方法,可以通過dir(object)函式來檢視
所有類內函式,都是如果有定義先呼叫定義的,沒有定義則呼叫預設的
相對而言__getattr__()函式更有用,其他兩個函式用的比較少
雙下劃線開頭的方法,只有在類的例項呼叫的時候才會觸發
作用例項
1.當屬性不存在時,不報錯
class
foo:
x =1def
__init__
(self, y)
: self.y = y
def__getattr__
(self, item)
:print
("執行__getattr__()"
)print
("不存在"
, item)
f1 = foo(10)
f1.age
2.所有屬性都要求是字串
class
foo:
x =1def
__init__
(self, y)
: self.y = y
def__setattr__
(self, key, value):if
type
(value)
isstr
: self.__dict__[key]
= value
print
("設定成功"
)else
:print
("屬性內容必須是字串,設定失敗"
)f1 = foo(10)
f2 = foo(
"cjj"
)
3.所有屬性都不允許刪除
class
foo:
x =1def
__init__
(self, y)
: self.y = y
def__delattr__
(self, item)
:print
("所有屬性不允許刪除"
)f1 = foo(10)
f1.name =
"cjj"
del f1.name
Python單下劃線和雙下劃線
python 用下劃線作為變數字首和字尾指定特殊變數。不能用 from moduleimport 匯入 系統定義名字 類中的私有變數名 核心風格 避免用下劃線作為變數名的開始。因為下劃線對直譯器有特殊的意義,而且是內建識別符號所使用的符號,我們建議程式設計師避免用下 劃線作為變數名的開始。一般來講,...
python的單下劃線和雙下劃線
python 類中的單下劃線開頭的變數表示 該方法為類的私有方法,原則上外部不能訪問,但是用.xx是可以訪問到的 雙下劃線開頭則是強制外部不能直接訪問的用.xx是訪問不到的,它內部其實是將變數名重新命名為 類名 變數名,所以可以通過.類名 變數名訪問 coding utf 8 author linh...
Python self 雙下劃線
class ball def init self,name self.name name ball ball qwe ball.name qwe class ball def setname self,name self.name name defkick self print 我是 s self....