歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Python學(xué)習(xí)之__slots__的使用

發(fā)布時間:2018-05-14 16:57  回復(fù):0  查看:2711   最后回復(fù):2018-05-14 16:57  

本文和大家分享的主要是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ò)

您還未登錄,請先登錄

熱門帖子

最新帖子

?