養成乙個好的習慣只需要堅持21天,day11
這兩天主要學習一下物件導向的高階程式設計。
使用__slots__
由之前學習類的定義和例項的建立,我們可以給例項繫結不同的屬性,例如:
class
student
(object):
pass
s = student(
)s.name =
'tom'
# 動態給例項繫結乙個屬性
print
(s.name)
# tom
如果我們只允許對student例項新增name和age屬性,達到限制的目的,我們就可以定義乙個特殊的__solts__
變數,來限制該class例項能新增的屬性,接下來student例項就只能新增name和age屬性了:
class
student
(object):
__solts__ =
('name'
,'age'
)#用tuple定義允許繫結的屬性名稱
接著進行測試:
s = student(
)#建立新的例項
s.name =
'tom'
# 繫結name屬性
s.age =
23# 繫結age屬性
s.score =
90# 繫結score屬性
# traceback (most recent call last):
# file "", line 1, in
# attributeerror: 'student' object has no attribute 'score'
由於score
屬性沒有被放到__solts__
中,所以不能繫結score
屬性;如果強行繫結就會得到attributeerror
錯誤。不過__slots__
定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的。例如graduatestudent子類是可以繫結score屬性的:
class
graduatestudent
(student)
: paa
g = graduatestudent(
)g.score =
999print
(g.score)
# 90
@property
在繫結屬性的時候,我們需要對引數進行檢查,比如上面在為物件的score屬性賦值999時,顯然是不符合我們生活中的分數的。為了限制score的範圍,可以通過設定方法來獲取和設定成績,比如set_score()
和get_score()
方法:
class
student
(object):
defget_score
(self)
:return self._score
defset_score
(self, value):if
notisinstance
(value,
int)
:raise valueerror(
'score must be an integer!'
)if value <
0or value >
100:
raise valueerror(
'score must between 0 ~ 100!'
) self._score = value
如上定義後,就不能對score隨意設值了。當賦予score的值不是int型別或者超過0-100時就會報錯:
s = student(
)s.set_score(90)
print
(s.get_score)
# 90
s.set_score(
999)
# traceback (most recent call last):..
.# valueerror: score must between 0 ~ 100!
這樣的呼叫略顯複雜,在python中可以使用@property
裝飾器負責把乙個方法變成屬性呼叫,即代替上面的功能:
class
student
(object):
@property
defscore
(self)
:return self._score
@score.setter
defscore
(self, value):if
notisinstance
(value,
int)
:raise valueerror(
'score must be an integer!'
)if value <
0or value >
100:
raise valueerror(
'score must between 0 ~ 100!'
) self._score = value
把乙個getter方法變成屬性,只需要加上@property
。此時,@property
本身又建立了另乙個裝飾器@score.setter
,負責把乙個setter方法變成屬性賦值,於是,我們就擁有乙個可控的屬性操作:
s = student(
)s.set_score(90)
print
(s.score)
# 90
s.set_score(
999)
# traceback (most recent call last):..
.# valueerror: score must between 0 ~ 100!
下面的例子中birth
是可讀寫屬性,而age
就是乙個唯讀屬性,因為age
可以根據birth
和當前時間計算出來。
class
student
(object):
@property
defbirth
(self)
:return self._birth
@birth.setter
defbirth
(self, value)
: self._birth = value
@property
defage
(self)
:return
2015
- self._birth
練習
請利用@property
給乙個screen物件加上width和height屬性,以及乙個唯讀屬性resolution:
class
screen
(object):
@property
defwidth
(self)
:return self._width
@width.setter
defwidth
(self,value):if
notisinstance
(value,
int)
:raise valueerror(
'width must be integer'
)if value <0:
raise valueerror(
'width must be above 0'
) self._width = value
@property
defheight
(self)
:return self._height
@height.setter
defheight
(self,value):if
notisinstance
(value,
int)
:raise valueerror(
'height must be integer'
)if value <0:
raise valueerror(
'height must be above 0'
) self._height = value
@property
defresolution
(self)
:return self.width * self.height
# 測試:
s = screen(
)s.width =
1024
s.height =
768print
('resolution ='
, s.resolution)
if s.resolution ==
786432
:print
('測試通過!'
)else
:print
('測試失敗!'
)# resolution = 786432
# 測試通過!
python廖雪峰教程 學習筆記
如何用字元來描述字元 d匹配數字 digit w匹配字母或數字 word s可以匹配空格 space 表示任意個字元,表示至少乙個字元 表示0個或1個字元,表示n個字元,表示n m個字元 可以匹配任意字元 例如 kongxiangyu w如何做到更精確的匹配?規定數字 字母或者下劃線 0 9a za...
廖雪峰python教程學習筆記(函式)
1.max函式可以接收任意多個引數,並返回最大的那個 2.函式名其實就是指向乙個函式物件的引用,完全可以把函式名賦給乙個變數,相當於給這個函式起了乙個別名 3.在python中,定義乙個函式要用def語句,依次寫出函式名 括號 括號中的引數和冒號,然後在縮排塊中編寫函式體,函式的返回值用return...
廖雪峰python教程筆記1
d.get thomas 1 檢查字典中是否有 thomas 的key,沒有返回 1,沒有指定返回值預設返回none d.pop bob 刪key 字典key不能為列表 s set 1,2,3 set需要以list作為輸入集合,不能重複且無順序。s.add s.remove s1 s2 s1 s2 ...