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 沒有返回例項物件,...