分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

Python学习之__slots__的使用

发布时间:2023-09-06 01:54责任编辑:苏小强关键词:暂无标签

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved