雙下劃線開頭的attr方法

2021-09-25 05:06:00 字數 2807 閱讀 7091

_ 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....