使用`@property`
在前面我們已經知道可以給類的例項繫結任何變數,而實際上作為動態語言的特點,不僅可以繫結變數,還可以給例項繫結方法,具體做法為:
>>
>
class
student
(object):
...pass..
.>>
> s = student(
)>>
>
defset_age
(self, age):.
.. self.age = age..
.>>
>
from types import methodtype
>>
> s.set_age = methodtype(set_age, s)
>>
> s.set_age(25)
>>
> s.age
25
當然只有繫結了這個方法的例項才能呼叫它,如果想要類的所有例項都能呼叫這個方法,可以給類繫結這個方法,具體做法為:
>>
>
defset_score
(self, score):.
.. self.score = score..
.>>
> student.set_score = set_score
雖然說直接把set_score()
定義在類中也可以讓所有例項能呼叫它,但動態繫結允許我們在程式執行中給類新增功能。
使用__slots__
可以限制繫結給例項的屬性,即讓例項只能夠繫結某些屬性,用法如下:
class
student
(object):
__slots__ =
('name'
,'age'
)# 用tuple定義允許繫結的屬性名稱
這樣student
類的例項就只能繫結name
和age
屬性了,如果試圖繫結其他屬性,就會報錯:
>>
> s.score =
99# 繫結屬性'score'
traceback (most recent call last)
: file ""
, line 1,in
attributeerror:
'student'
object has no attribute 'score'
需要注意的__slots__
對類屬性的限制僅對當前類例項起作用,不會影響到子類例項:
>>
>
class
graduatestudent
(student):.
..pass..
.>>
> g = graduatestudent(
)>>
> g.score =
9999
在之前的操作中我們可以對類例項的屬性進行任意的更改,這可能會造成一些問題:
如果我們想要限制對屬性的修改的話,可以通過自定義乙個set()
函式來實現,但這樣**就不簡潔了,我們希望能夠在直接給屬性賦值的情況下依然可以限制範圍,那麼@property
就可以幫我們實現這種功能。
下面我以rectangle
這個類為例來說明@property
的作用:
class
rectangle
(object):
def__init__
(self)
: self.width =
10 self.height=
20
讓width和height這兩個屬性不能被修改:
class
rectangle
(object):
@property
defwidth
(self)
:return self._width
@property
defheight
(self)
:return self._height
s = rectangle(
)#與方法名一致
s.width =
1024
s.height =
768print
(s.width,s.height)
python3之物件導向 屬性
物件導向程式設計中屬性有 成員屬性 類屬性 例項屬性。成員屬性 在類的初始化方法中繫結的屬性 類屬性 歸所在類所有,但該類和該類的所有例項都可以訪問到 例項屬性 在例項化物件時對當前物件增加的屬性,只有該物件可以訪問。class person person類 num 20 類屬性 def init ...
python3高階之物件導向 一
定義類 class car 方法 def getcarinfo self print 車輪子個數 d,顏色 s self.wheelnum,self.color def move self print 車正在移動.usr bin python coding utf 8 class employee ...
python3學習筆記 物件導向
python物件導向也是通過類的機制實現。python類的語法如下。class example 基本屬性 property1 0 property2 私有屬性,類外不能被訪問 property3 屬性p4在上面沒有顯示宣告。可通過建構函式直接宣告並初始化。def init self,p1,p2,p3...