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中for循环详解
Jan 17 Python
Python中字符串对齐方法介绍
May 21 Python
python学习教程之使用py2exe打包
Sep 24 Python
python2.7实现FTP文件下载功能
Apr 15 Python
python自动发送测试报告邮件功能的实现
Jan 22 Python
Python获取时间戳代码实例
Sep 24 Python
Python实现手机号自动判断男女性别(实例解析)
Dec 22 Python
解决Python logging模块无法正常输出日志的问题
Feb 21 Python
Python实现动态给类和对象添加属性和方法操作示例
Feb 29 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
May 11 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 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.01发布
2006/10/09 PHP
新浪新闻小偷
2006/10/09 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
python编写暴力破解FTP密码小工具
2014/11/19 Python
Python中使用SAX解析xml实例
2014/11/21 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
python查看列的唯一值方法
2018/07/17 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
毕业生找工作推荐信
2013/11/21 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
委托书的写法
2014/08/30 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python