标签:
本文和大家分享的主要是python中__slots__的使用相关内容,一起来看看吧,希望对大家学习python有所帮助。
正常情况下,当我们定义了一个 class ,创建了一个 class 的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义 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 绑定方法后,所有实例均可调用:
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 中,但动态绑定允许我们在程序运行的过程中动态给 class 加上功能,这在静态语言中很难实现。
使用slots
但是,如果我们想要限制实例的属性怎么办?比如,只允许对 Student 实例添加 name 和 age 属性。
为了达到限制的目的,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__ 定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
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__ 。
来源:网络
标签: