(六)物件導向高階程式設計

2022-04-27 11:03:07 字數 2376 閱讀 5609

如果我們想要限制例項的屬性怎麼辦?比如,只允許對student例項新增name和age屬性。

為了達到限制的目的,python允許在定義class的時候,定義乙個特殊的slots變數,來限制該class例項能新增的屬性:

class student(object):

__slots__= (『name』, 『age』) # 用tuple定義允許繫結的屬性名稱

>>> s = student() # 建立新的例項

>>> s.name = 'michael'

# 繫結屬性'name'

>>> s.age = 25

# 繫結屬性'age'

>>> s.score = 99

# 繫結屬性'score'

traceback (most recent call last):

file "", line 1, in

attributeerror: 'student' object has no attribute 'score'

由於』score』沒有被放到__slots__中,所以不能繫結score屬性,試圖繫結score將得到attributeerror的錯誤。

使用__slots__要注意,__slots__定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的:

>>> class graduatestudent(student):

... pass

...>>> g = graduatestudent()

>>> g.score = 9999

除非在子類中也定義__slots__,這樣,子類例項允許定義的屬性就是自身的__slots__加上父類的__slots__

對於類的方法,裝飾器一樣起作用。python內建的@property裝飾器就是負責把乙個方法變成屬性呼叫的:

class

student

(object):

@property

defscore

(self):

return self._score

@score.setter

defscore

(self, value):

ifnot isinstance(value, int):

raise valueerror('score must be an integer!')

if value < 0

or value > 100:

raise valueerror('score must between 0 ~ 100!')

self._score = value

@property的實現比較複雜,我們先考察如何使用。把乙個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又建立了另乙個裝飾器@score.setter,負責把乙個setter方法變成屬性賦值,於是,我們就擁有乙個可控的屬性操作:

>>> s = student()

>>> s.score = 60

# ok,實際轉化為s.set_score(60)

>>> s.score # ok,實際轉化為s.get_score()

60>>> s.score = 9999

traceback (most recent call last):

...valueerror: score must between 0 ~ 100!

注意到這個神奇的@property,我們在對例項屬性操作的時候,就知道該屬性很可能不是直接暴露的,而是通過getter和setter方法來實現的。

還可以定義唯讀屬性,只定義getter方法,不定義setter方法就是乙個唯讀屬性:

class

student

(object):

@property

defbirth

(self):

return self._birth

@birth.setter

defbirth

(self, value):

self._birth = value

@property

defage

(self):

return

2015 - self._birth

物件導向高階程式設計

相同class的各物件互為友元 class complex int func const complex param private double re,im string inline string string const char cstr 0 else inline string strin...

python 物件導向高階程式設計

python 裝飾器 property使用 classscreen property defwidth self returnself.width pass width.setter defwidth self,value self.width value property defheight se...

python物件導向高階程式設計

1.繫結方法 給所有例項都繫結方法,可以給class繫結方法 def set score self,score self.score score student.set score set score 給class繫結方法後,所有例項均可呼叫。但是,如果我們想要限制例項的屬性怎麼辦?比如,只允許對s...