這篇文章主要介紹了在python中使用__slots__方法的詳細教程,__slots__方法是python的乙個重要內建類方法,**基於python2.x版本,需要的朋友可以參考下
正常情況下,當我們定義了乙個class,建立了乙個class的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。先定義class:?
12
3
>>>
class
student(
object
):
...
pass
...
然後,嘗試給例項繫結乙個屬性:?
12
3
4
>>> s
=
student()
>>> s.name
=
'michael'
# 動態給例項繫結乙個屬性
>>>
print
s.name
michael
還可以嘗試給例項繫結乙個方法:?
12
3
4
5
6
7
8
>>>
def
set_age(
self
, age):
# 定義乙個函式作為例項方法
...
self
.age
=
age
...
>>>
from
types
import
methodtype
>>> s.set_age
=
methodtype(set_age, s, student)
# 給例項繫結乙個方法
>>> s.set_age(
25
)
# 呼叫例項方法
>>> s.age
# 測試結果
25
但是,給乙個例項繫結的方法,對另乙個例項是不起作用的:?
12
3
4
5
>>> s2
=
student()
# 建立新的例項
>>> s2.set_age(
25
)
# 嘗試呼叫方法
traceback (most recent call last):
file
""
, line
1
,
in
attributeerror:
'student'
object
has no attribute
'set_age'
為了給所有例項都繫結方法,可以給class繫結方法:?
12
3
4
>>>
def
set_score(
self
, score):
...
self
.score
=
score
...
>>> student.set_score
=
methodtype(set_score,
none
, student)
給class繫結方法後,所有例項均可呼叫:?
12
3
4
5
6
>>> s.set_score(
100
)
>>> s.score
100
>>> s2.set_score(
99
)
>>> s2.score
99
通常情況下,上面的set_score方法可以直接定義在class中,但動態繫結允許我們在程式執行的過程中動態給class加上功能,這在靜態語言中很難實現。
使用__slots__
但是,如果我們想要限制class的屬性怎麼辦?比如,只允許對student例項新增name和age屬性。
為了達到限制的目的,python允許在定義class的時候,定義乙個特殊的__slots__變數,來限制該class能新增的屬性:?
12
3
>>>
class
student(
object
):
... __slots__
=
(
'name'
,
'age'
)
# 用tuple定義允許繫結的屬性名稱
...
然後,我們試試:?
12
3
4
5
6
7
>>> 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__定義的屬性僅對當前類起作用,對繼承的子類是不起作用的:?
12
3
4
5
6
>>>
class
graduatestudent(student):
...
pass
...
>>> g
=
graduatestudent()
>>> g.score
=
9999
try
除非在子類中也定義__slots__,這樣,子類允許定義的屬性就是自身的__slots__加上父類的__slots__。
在QThread中使用slots
qthread 似乎是很難的乙個東西,特別是訊號和槽,有非常多的人 儘管使用者本人往往不知道 在用不恰當 甚至錯誤 的方式在使用 qthread,隨便用google一搜,就能搜出大量結果出來。無怪乎qt的開發人員 bradley t.hughes 聲嘶力竭地喊you are doing it wro...
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
正常情況下,當我們定義了乙個class,建立了乙個class的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。先定義class class student object pass 然後,嘗試給例項繫結乙個屬性 s student s.name michael 動態給例項繫結乙個屬...