Python3學習筆記之物件導向高階程式設計

2021-08-28 04:50:19 字數 2365 閱讀 3060

使用`@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類的例項就只能繫結nameage屬性了,如果試圖繫結其他屬性,就會報錯:

>>

> 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...