python3中使用__slots__限定实例属性操作分析


Posted in Python onFebruary 14, 2020

本文实例讲述了python3中使用__slots__限定实例属性操作。分享给大家供大家参考,具体如下:

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:

# 类定义
class Person(object):
  pass

然后,尝试给实例绑定一个属性:

p = Person()
p.name = "jadeshu"
print(p.name)

输出:

jadeshu

还可以尝试给实例绑定一个方法:

# 类定义
class Person(object):
  pass
p = Person()
p.name = "jadeshu"
print(p.name)
def set_age(self, age): # 定义一个函数作为实例方法
  self.age = age
from types import MethodType
p.set_age = MethodType(set_age, p)
p.set_age(25)
print(p.age)

输出:

jadeshu
25

但是,给一个实例绑定的方法,对另一个实例是不起作用的:

p2 = Person() #创建新的实例
p2.set_age(25) #调用方法

出错:

Traceback (most recent call last):
25
  File "C:/Users/Administrator/Desktop/PycharmProjects/test.py", line 48, in <module>
    p2.set_age(25)
AttributeError: 'Person' object has no attribute 'set_age'

为了给所有实例都绑定方法,可以给class绑定方法:

def set_score(self, score):
  self.score = score
Person.set_score = set_score
p.set_score(80)
print(p.score)

输出:80

给class绑定方法后,所有实例均可调用:

p.set_score(80)
p2 = Person()
p2.set_score(100)
print(p.score)
print(p2.score)

输出:

80
100

通常情况下,上面的set_score方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现。

使用__slots__

但是,如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

class Person(object):
  __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

然后,我们试试:

>>> s = Person() # 创建新的实例
>>> s.name = 'jadeshu' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'

由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

>>> class Student(Person):
...   pass
...
>>> s = Student()
>>> s.score = 9999

除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python自动化测试之连接几组测试包实例
Sep 28 Python
python 字符串和整数的转换方法
Jun 25 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
实例介绍Python中整型
Feb 11 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
如何基于python实现不邻接植花
May 01 Python
新手常见Python错误及异常解决处理方案
Jun 18 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 07 Python
只用50行Python代码爬取网络美女高清图片
Jun 02 Python
OpenCV-Python实现油画效果的实例
Jun 08 Python
python 命名规范知识点汇总
Feb 14 #Python
wxPython修改文本框颜色过程解析
Feb 14 #Python
python中提高pip install速度
Feb 14 #Python
pycharm快捷键汇总
Feb 14 #Python
python随机模块random使用方法详解
Feb 14 #Python
python实现连连看游戏
Feb 14 #Python
python读取与处理netcdf数据方式
Feb 14 #Python
You might like
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
杏林同学录(三)
2006/10/09 PHP
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
2017/02/28 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
js简单抽奖代码
2015/01/16 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
一款简单的jQuery图片标注效果附源码下载
2016/03/22 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
详解js访问对象的属性和方法
2018/10/25 Javascript
小程序转发探索示例
2019/02/19 Javascript
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
python实现抖音视频批量下载
2018/06/20 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
五一活动标语
2014/06/30 职场文书
检讨书范文
2015/01/27 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python