python面向对象__slots__变量的运用

大家都知道,类创建实例的时候,可以给这个实例添加属性,而__slots__的作用就是限制我们能添加哪些属性,写一个简单的例子。

class Student(object):
  __slots__=('name','age')
s=Student()
s.name='MR.xu'
s.age=22
s.core=30

运行结果 我们会得到一个错误:AttributeError: 'Student' object has no attribute 'score'  提示我们没有score这个属性,结果就是,name是age这两个属性被添加了,而score被拒绝

这个时候我们再创建一个Student的子类 Student2

class Student2(Student):
  pass 
s2=Student2()
s2.name='MR.lee'

s2.score=100

s2.age=22

print(s2.name,s2.age,s2.score)

运行结果为

MR.xu 22 100

可以看出,虽然我们继承了Student类,但是并没有继承他的__slots__变量,我们可以给Student2的实例添加任何属性,那我们再给Student2定义一个__slots__变量看看

class Student2(Student):
  __slots__=('grade') 
s2=Student2()

s2.name='MR.xu'
print(s2.name)
s2.age=22
print(s2.age)
s2.score=100
print(s2.score)
s2.grade='大一'
print(s2.grade)

在这里,我们给Student2这个类中添加了__slots__变量值为grade,并给实例s2添加了grade属性

我们来看下分别运行的结果运行结果:

s2.name='MR.xu'
print(s2.name)

MR.xu

---------------------------------

s2.age=22
print(s2.age)

22

---------------------------------

s2.score=100
print(s2.score)

AttributeError: 'Student2' object has no attribute 'score'

---------------------------------

s2.grade='大一'
print(s2.grade)

大一

grade,name,age三个属性都成功添加,唯独score没有,原因就是子类如果定义了__slots__变量,那么他就允许创建自己本身(Student2)的__slots__变量和它的父类(Student)的

__slots__变量。即子类(Student2)的实例(s2)允许创建(‘grade’,'name','age')三个属性