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中的With语句
Feb 02 Python
Python随机生成数模块random使用实例
Apr 13 Python
Python 爬虫图片简单实现
Jun 01 Python
Python实现excel转sqlite的方法
Jul 17 Python
python opencv检测目标颜色的实例讲解
Apr 02 Python
python实现textrank关键词提取
Jun 22 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
python读写文件write和flush的实现方式
Feb 21 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
python实现斗地主分牌洗牌
Jun 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
PR值查询 | PageRank 查询
2006/12/20 PHP
php 对输入信息的进行安全过滤的函数代码
2012/06/29 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
Zend Guard使用指南及问题处理
2015/01/07 PHP
php去除html标记的原生函数详解
2015/01/27 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
javascript中获取选中对象的类型
2007/04/02 Javascript
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
原生js实现放大镜组件
2021/01/22 Javascript
在Python的Flask框架中构建Web表单的教程
2016/06/04 Python
python字典键值对的添加和遍历方法
2016/09/11 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
python 求定积分和不定积分示例
2019/11/20 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
如何在django中运行scrapy框架
2020/04/22 Python
深入理解Python 多线程
2020/06/16 Python
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
广告学毕业生求职信
2014/01/30 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
高一军训口号
2015/12/25 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书