python基礎 使用 slots

2021-09-08 19:11:58 字數 3723 閱讀 2526

正常情況下,當我們定義了乙個class,建立了乙個class的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。先定義class:

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

是,給乙個例項繫結的方法,對另乙個例項是不起作用的

>>> s2 = student() #

建立新的例項

>>> s2.set_age(25) #

嘗試呼叫方法

traceback (most recent call last):

file

"", line 1, in

attributeerror:

'student

' object has no attribute '

set_age

'

為了給所有例項都繫結方法,可以給class繫結方法

>>> def

set_score(self, score):

... self.score =score

...>>> student.set_score = set_score

給class繫結方法後,所有例項均可呼叫:

>>> s.set_score(100)

>>>s.score

100>>> s2.set_score(99)

>>>s2.score

99

通常情況下,上面的set_score方法可以直接定義在class中,但動態繫結允許我們在程式執行的過程中動態給class加上功能,這在靜態語言中很難實現。

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

為了達到限制的目的,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 使用__slots__ 示例

#2016-8-29 21:25:14

#mengmengcoding

#-*- coding: utf-8 -*-

#使用__slots__限制例項的屬性

class

student(object):

__slots__=('

name

','age

') #

用tuple定義允許繫結的屬性名稱

#新類,繼承於student

class

graduatestudent(student):

pass

s=student() #

建立新的例項

s.name='

shuke'#

繫結屬性'name'

s.age=25 #

繫結屬性'age'

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

try:

s.score=99

except

attributeerror as e:

print('

attributeerror:

',e)

g=graduatestudent() #

建立新的例項

'''使用__slots__要注意,__slots__定義的屬性僅對當前類例項起作用,

對繼承的子類是不起作用的

'''g.score=99 #

繫結屬性'score'

print('

g.score=

',g.score)

Python基礎 使用 slots

定義乙個特殊的slots變數,來限制該class例項能新增的屬性 示例 usr bin env python3 coding utf 8 slots class student1 object pass defruntest1 s student1 s.name 蠟筆小新 s.age 6 s.sco...

python語法基礎 slots

slots class student object slots name age 限制student類例項的屬性,最多只能是name和age s student 例項化s s.name micle 為s例項新增name屬性,並賦值 s.age 15 print s.age,s.name 列印s例項...

在Python中使用 slots

這篇文章主要介紹了在python中使用 slots 方法的詳細教程,slots 方法是python的乙個重要內建類方法,基於python2.x版本,需要的朋友可以參考下 正常情況下,當我們定義了乙個class,建立了乙個class的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。...