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编程之属性和方法实例详解
May 19 Python
python MySQLdb使用教程详解
Mar 20 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
Python学习小技巧总结
Jun 10 Python
python主线程捕获子线程的方法
Jun 17 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
Aug 15 Python
Python笔记之代理模式
Nov 20 Python
Python属性和内建属性实例解析
Jan 14 Python
Python换行与不换行的输出实例
Feb 19 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
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
JQuery获得内容和属性方法解析
2020/05/30 jQuery
python 实现归并排序算法
2012/06/05 Python
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Python脚本实现12306火车票查询系统
2016/09/30 Python
Python中字典和集合学习小结
2017/07/07 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
Python读写压缩文件的方法
2020/07/30 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
python 读取、写入txt文件的示例
2020/09/27 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
Nike香港官网:Nike HK
2019/03/23 全球购物
班级寄语大全
2014/04/10 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电
 python中的元类metaclass详情
2022/05/30 Python