本文和大家分享的主要是python中__slots__的使用相關(guān)內(nèi)容,一起來看看吧,希望對大家學(xué)習(xí)python有所幫助。
正常情況下,當(dāng)我們定義了一個 class ,創(chuàng)建了一個 class 的實例后,我們可以給該實例綁定任何屬性和方法,這就是動態(tài)語言的靈活性。先定義 class :
class Student(object):
pass
然后,嘗試給實例綁定一個屬性:
class Student(object):
pass
s=Student()
s.name='Lucy'
print(s.name)
還可以嘗試給實例綁定一個方法:
def set_age(self,age):
self.age=agefrom types import MethodTypeclass Student(object):
pass
s=Student()# s.name='Lucy'# print(s.name)
s.set_age=MethodType(set_age,s)
s.set_age(25)
print(s.age)
25
[Finished in 0.1s]
但是,給一個實例綁定的方法,對另一個實例是不起作用的:
s2=Student()
s2.set_age(25)
File "/Users/apple/Desktop/getObjectInfo.py", line 56, in
s2.set_age(25)
AttributeError: 'Student' object has no attribute 'set_age'
為了給所有實例都綁定方法,可以給 class 綁定方法:
def set_score(self,score):
self.score=score
Student.set_score=set_score
s.set_score(25)
print(s.score)
2525
[Finished in 0.1s]
給 class 綁定方法后,所有實例均可調(diào)用:
Student.set_score=set_score
s.set_score(25)print(s.score)
s2.set_score(50)print(s2.score)
2550
[Finished in 0.1s]
通常情況下,上面的 set_score 方法可以直接定義在 class 中,但動態(tài)綁定允許我們在程序運行的過程中動態(tài)給 class 加上功能,這在靜態(tài)語言中很難實現(xiàn)。
使用slots
但是,如果我們想要限制實例的屬性怎么辦?比如,只允許對 Student 實例添加 name 和 age 屬性。
為了達(dá)到限制的目的,Python允許在定義 class 的時候,定義一個特殊的 __slots__ 變量,來限制該 class 實例能添加的屬性:
class Student(object):
__slots__=('name','age')
然后,我們試試:
class Student(object):
__slots__=('name','age')
s=Student()
s.name='Lucy'
s.age=18
s.score=55
File "/Users/apple/Desktop/getObjectInfo.py", line 69, in
s.score=55
AttributeError: 'Student' object has no attribute 'score'
由于 score 沒有被放到 __slots__ 中,所以不能綁定 score 屬性,試圖綁定 score 將得到 AttributeError 的錯誤。
使用 __slots__ 要注意, __slots__ 定義的屬性僅對當(dāng)前類實例起作用,對繼承的子類是不起作用的:
class Student(object):
__slots__=('name','age')class Bob(Student):
pass
s=Student()
s.name='Lucy'
s.age=18# s.score=55
bob=Bob()
bob.score=999
print(bob.score)
999
[Finished in 0.1s]
除非在子類中也定義 __slots__ ,這樣,子類實例允許定義的屬性就是自身的 __slots__加上父類的 __slots__ 。
來源:網(wǎng)絡(luò)