正常情況下,當我們定義了乙個class,建立了乙個class的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。先定義class:
classstudent(object):
pass
然後,嘗試給例項繫結乙個屬性:
>>> s =student()>>> s.name = '
michael'#
動態給例項繫結乙個屬性
(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繫結方法:
>>> defset_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例項新增name
和age
屬性。
為了達到限制的目的,python允許在定義class的時候,定義乙個特殊的__slots__
變數,來限制該class例項能新增的屬性:
classstudent(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__
定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的:
>>> classgraduatestudent(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的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。...