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 文件操作api(文件操作函数)
Aug 28 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
python模块之sys模块和序列化模块(实例讲解)
Sep 13 Python
python生成以及打开json、csv和txt文件的实例
Nov 16 Python
python实现最大优先队列
Aug 29 Python
python 命令行传入参数实现解析
Aug 30 Python
python 动态迁移solr数据过程解析
Sep 04 Python
3种python调用其他脚本的方法
Jan 06 Python
Python终端输出彩色字符方法详解
Feb 11 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
Python reduce函数作用及实例解析
May 08 Python
python在CMD界面读取excel所有数据的示例
Sep 28 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
fgetcvs在linux的问题
2012/01/15 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
拖动布局之保存布局页面cookies篇
2010/10/29 Javascript
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
react配置antd按需加载的使用
2019/02/11 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
python实现跨文件全局变量的方法
2014/07/07 Python
python关键字and和or用法实例
2015/05/28 Python
python基础知识小结之集合
2015/11/25 Python
Python 对象中的数据类型
2017/05/13 Python
详解Python字典的操作
2019/03/04 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
linux面试题参考答案(5)
2016/11/05 面试题
中英文求职信范文
2014/01/27 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
MySQL批量更新不同表中的数据
2022/05/11 MySQL