小甲魚python045魔法方法 屬性訪問

2021-09-10 14:20:11 字數 3492 閱讀 5001

0.0 屬性訪問方法

object.attr

getattr()

getattr

(object

,'attr'[,

'return this string if attr is not in object'

])

[ ] 內為可選項,如果不新增該項,且如果attr不存在於object中則報錯attributeerror

0.1 property函式

用屬性訪問屬性

classc:

def__init__

(self, size =10)

: self.size = size

defgetsize

(self)

:return self.size

defsetsize

(self, size)

: self.size = size

defdelsize

(self)

:del self.size

x =property

(getsize,setsize,delsize)

>>

> c = c(

)>>

> c.x =

1>>

> c.x

1>>

> c.size

1>>

>

del c.x

>>

> c.size

attributeerror:

'c'object has no attribute 'size'

使用了property()函式是 x 和 size掛鉤

0.2 幾種魔法方法訪問屬性

重寫魔法方法控制屬性訪問

魔法方法

功能__getattr__(self, name)

定義當使用者試圖獲取乙個不存在的屬性時的行為

__getattribute__(self, name)

定義當該類屬性被訪問時的行為,無論該屬性是否存在

__setattr__(self,name, value)

定義當乙個屬性被設定時的行為

__delattr__(self, name)

定義當乙個屬性被刪除時的行為

對這些進行修改

classc:

def__getattribute__

(self, name)

:print

("getattribute"

)return

super()

.__getattribute__(name)

def__getattr__

(self,name)

:print

("getattr"

)def

__setattr__

(self, name, value)

:print

("setattr"

)super()

.__setattr__(name, value)

:def

__delattr__

(self, name)

:print

("delattr"

)super()

.__delattr__(name)

>>

> c = c(

)>>

> c.x

getattribute

getattr

>>

> c.x =

1setattr

>>

> c.x

getattribute

1>>

>

del c.x

delattr

注意__setattr__()的無限遞迴:

>>

>

class

rectangle()

:def

__init__

(self, height=

0, width=0)

: self.height = height

self.width = width

def__setattr__

(self, name, value)

:if name ==

"square"

: self.height = value

self.width = value

else

: self.name = value

>>

> r = rectangle(

)traceback (most recent call last)

: file ""

, line 1,in

r = rectangle(

) file ""

, line 3

,in __init__

self.height = height

file ""

, line 10

,in __setattr__

self.name = value

file ""

, line 10

,in __setattr__

self.name = value

file ""

, line 10

,in __setattr__

self.name = value

[previous line repeated 325 more times]

file ""

, line 6

,in __setattr__

if name ==

"square"

:recursionerror: maximum recursion depth exceeded in comparison

#解決遞迴方法1: 使用基類

def__setattr__

(self, name, value)

:if name ==

"square"

: self.height = value

self.width = value

else

:super()

.__setattr__(

'name'

,value)

#解決遞迴方法2: 使用__dict__屬性

def__setattr__

(self, name, value)

:if name ==

"square"

: self.height = value

self.width = value

else

: self.__dict__[

'name'

]= value

Python學習,小甲魚044魔法方法,簡單定製

self.unit 年 月 天 小時 分鐘 秒 self.prompt 未開始 self.lasted self.start 0 self.stop 0 def str self return self.prompt def add self other prompt 總共執行了 result fo...

小甲魚 入門學習python筆記 魔法方法

new cls 物件例項化呼叫的第乙個方法,它的第乙個引數是這個類,而其他引數會直接傳遞給 init 方法 需要在基類的基礎上對其進行修改時重寫 new 方法 del 方法 只有在該類例項化的物件全部被del掉時,才呼叫 del 方法 python 中的運算子過載 class new int int...

Python魔法方法 基本的魔法方法

new cls 1.new 是在乙個物件例項化時候所呼叫的第乙個方法 2.他的第乙個引數是這個類,其他的引數是用來直接傳遞給 init 方法 3.new 決定是否使用該 init 方法,因為.new 可以直接呼叫其他類的構造方法,或者返回別的例項物件來作為本類的例項,如果 new 沒有返回例項物件,...