Python廖雪峰教程學習筆記 Day11

2021-10-03 03:35:04 字數 4816 閱讀 4300

養成乙個好的習慣只需要堅持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 ...