Python学习之__slots__的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习之__slots__的使用相关的知识,希望对你有一定的参考价值。

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

 

来源:网络

以上是关于Python学习之__slots__的使用的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之七面向对象高级编程——__slots__的使用

Python模块学习之特殊函数 __call__ 的使用

python学习之__str__,__repr__

python模块学习之__future__

python学习之运用特殊方法,定制类

python学习之自省/反射