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 相关文章推荐
使用numba对Python运算加速的方法
Oct 15 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
Jun 24 Python
python按比例随机切分数据的实现
Jul 11 Python
python自定义时钟类、定时任务类
Feb 22 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
python无序链表删除重复项的方法
Jan 17 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
django中websocket的具体使用
Jan 22 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 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
php foreach、while性能比较
2009/10/15 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
JavaScript效率调优经验
2009/06/04 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
Vue 进阶教程之v-model详解
2017/05/06 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
Python中super的用法实例
2015/05/28 Python
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
python中web框架的自定义创建
2019/09/08 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
Numpy中ndim、shape、dtype、astype的用法详解
2020/06/14 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
员工薪酬福利制度
2014/01/17 职场文书
大学生学年个人总结
2015/02/15 职场文书
母亲节感言
2015/08/03 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫
Golang流模式之grpc的四种数据流
2022/04/13 Golang