在之前的讲解中,python是 动态语言,可以动态给对象(实例) 绑定属性,这是动态语言的灵活性。
但有时要 限制 对象(实例)的属性,如list等内置对象,是不能绑定自定义的属性的
执行下面代码:
>>>l=[1,2,3]
>>>l.name='测试'
会报错
执行下面的代码:
>>>import datetime
>>>t=datetime.datetime.today()
>>>t.name='测试'
也会报错
__slots__类属性
定义类时,定义一个特殊的__slots__类属性,限制 该类的 实例属性(不限制 类属性)
代码:
class Student:
__slots__=('name','age','sex')
xiaoming=Student()
xiaoming.name='小明'
#下面代码执行报错
xiaoming.money=1000
子类
当子类继承父类时,父类的__slots__属性 是否 会限制子类的实例属性?
创建CollegeStudent类,继承Student类
代码如下:
class CollegeStudent(Student):
pass
lilei=CollegeStudent()
lilei.name='李雷'
lilei.money=1000
总结
从执行结果可知,子类 没定义 __slots__类属性,父类的__slots__属性 不会 限制子类的实例属性
子类定义__slots__类属性
class CollegeStudent(Student):
__slots__='money'
lilei=CollegeStudent()
lilei.name='李雷'#这行代码不会报错
lilei.money=1000
#下面代码会报错
lilei.card='工商卡'
总结
子类 定义 __slots__类属性后,子类对象允许定义的属性就是 自身 的__slots__加上 父类 的__slots__