默認我們可以給class實例綁定任何屬性和方法,這就是動態語言的靈活性如果我們想要限制class的屬性怎麼辦?比如,只允許對Student實例添加name和age屬性。爲了達到限制的目的,Python允許在定義class的時候,定義一個特殊的__slots__變量,來限制該class能添加的屬性:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Student(object):
__slots__ = ("name","age")
def __init__(self,name,age):
self.name=name
self.age=age
def print_type(self):
print("my name is %s,age is %s" %(self.name,self.age))
p=Student("ye",18)
p.addr='重慶市' #新增addr屬性會報錯
p.print_type()
由於'addr'沒有被放到__slots__中,所以不能綁定addr實例屬性,試圖綁定addr將得到AttributeError的錯誤。
使用__slots__要注意,__slots__定義的屬性僅對當前類起作用,對繼承的子類是不起作用的:
除非在子類中也定義__slots__,這樣,子類允許定義的屬性就是自身的__slots__加上父類的__slots__。