在Python中使用 slots

2021-07-30 14:29:11 字數 4732 閱讀 8589

這篇文章主要介紹了在python中使用__slots__方法的詳細教程,__slots__方法是python的乙個重要內建類方法,**基於python2.x版本,需要的朋友可以參考下

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

12

3

>>>classstudent(object):

...pass

...

然後,嘗試給例項繫結乙個屬性:?

12

3

4

>>> s=student()

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

>>>prints.name

michael

還可以嘗試給例項繫結乙個方法:?

12

3

4

5

6

7

8

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

...self.age=age

...

>>>fromtypesimportmethodtype

>>> 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"", line1,in

attributeerror:'student'objecthas no attribute'set_age'

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

12

3

4

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

>>>classstudent(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"", line1,in

attributeerror:'student'objecthas no attribute'score'

由於'score'沒有被放到__slots__中,所以不能繫結score屬性,試圖繫結score將得到attributeerror的錯誤。

使用__slots__要注意,__slots__定義的屬性僅對當前類起作用,對繼承的子類是不起作用的:?

12

3

4

5

6

>>>classgraduatestudent(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 動態給例項繫結乙個屬...