码迷,mamicode.com
首页 > Web开发 > 详细

Python学习之__slots__的使用

时间:2018-05-14 16:59:10      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
wjunxi
加入时间:2017-06-15
  关注此人  发短消息
文章分类
wjunxi”关注的人------(0
wjunxi”的粉丝们------(0
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!