python物件導向程式設計高階篇 slots

2021-10-10 06:28:40 字數 2252 閱讀 5673

python語言中我們可以隨時給例項增加新的屬性和方法

class student(object):

pass

>>> s = student()

>>> s.name = 'michael' # 動態給例項繫結乙個屬性

>>> print(s.name)

michael

>>> def set_age(self, age): # 定義乙個函式作為例項方法

... self.age = age

...>>> from types import methodtype

>>> s.set_age = methodtype(set_age, s) # 給例項繫結乙個方法

>>> s.set_age(25) # 呼叫例項方法

>>> s.age # 測試結果

25

分別增加了乙個屬性'name' 方法 set_age() 附帶增加屬性age

注意 只是對當前例項有效,其他例項無效

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方法作為屬性呼叫,這樣避免屬性的直接暴露,而通過間接方法getter和setter實現,雖然可能在類外直接看不到。當然如果沒有setter方法的話,那麼屬性就是唯讀的。

class student(object):

@property

def score(self):

return self._score

@score.setter

def score(self, value):

if not 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

乙個子類可以繼承多個父類,以及多個方法;可以更快捷的進行組織。

>>> class student(object):

... def __init__(self, name):

... self.name = name

... def __str__(self):

... return 'student object (name: %s)' % self.name

__repr__ = __str__

#print列印例項,呼叫__str__

>>> print(student('michael'))

#直接顯示例項,呼叫__repr__

>>> s = student('michael')

>>> s

class fib(object):

def __init__(self):

self.a, self.b = 0, 1 # 初始化兩個計數器a,b

def __iter__(self):

return self # 例項本身就是迭代物件,故返回自己

def __next__(self):

self.a, self.b = self.b, self.a + self.b # 計算下乙個值

if self.a > 100000: # 退出迴圈的條件

raise stopiteration()

return self.a # 返回下乙個值

>>> for n in fib():

... print(n)

Python物件導向程式設計高階

在前面的章節我們已經了解了物件導向的入門知識,知道了如何定義類,如何建立物件以及如何給物件發訊息。為了能夠更好的使用物件導向程式設計思想進行程式開發,我們還需要對python中的物件導向程式設計進行更為深入的了解。property裝飾器 之前我們討論過python中屬性和方法訪問許可權的問題,雖然我...

python 物件導向(高階篇)

文章摘自 類的成員可以分為三大類 字段 方法和屬性 方法 普通方法,靜態方法,類方法。屬性 普通屬性 字段包括 普通欄位和靜態字段,他們在定義和使用中有所區別,而最本質的區別是記憶體中儲存的位置不同,class student school python學院 def init self,name,a...

Python高階 物件導向程式設計

class user object pass按照慣例,類名以大寫字母開頭,緊接著是 object 表示該類是從 object 類進行繼承的。user user 可以在類的建構函式 init 定義類的屬性。class user object def init self,name,age self.na...