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判断直线和矩形是否相交的方法
Jul 14 Python
Python利用IPython提高开发效率
Aug 10 Python
python使用Tesseract库识别验证
Mar 21 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
用python编写第一个IDA插件的实例
May 29 Python
Selenium定位元素操作示例
Aug 10 Python
Django框架设置cookies与获取cookies操作详解
May 27 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 Python
python实现简易名片管理系统
Apr 11 Python
Django如何创作一个简单的最小程序
May 12 Python
Python爬虫基础之初次使用scrapy爬虫实例
Jun 26 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 5.0对象模型深度探索之对象复制
2008/03/27 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
Spring MVC中Ajax实现二级联动的简单实例
2016/07/06 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
python读写LMDB文件的方法
2018/07/02 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
python中实现栈的三种方法
2020/12/19 Python
Python中的面向接口编程示例详解
2021/01/17 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
澳大利亚领先的内衣店:Bendon Lingerie澳大利亚
2020/05/15 全球购物
自我鉴定模板
2013/10/29 职场文书
营销与策划应届生求职信
2013/11/04 职场文书
运动会入场词200字
2014/02/15 职场文书
《木笛》教学反思
2014/03/01 职场文书
2014年工商所工作总结
2014/12/09 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
行政二审代理词
2015/05/25 职场文书
JS实现数组去重的11种方法总结
2022/04/04 Javascript
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python