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 Web服务器Tornado使用小结
May 06 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
使用python实现链表操作
Jan 26 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
对Python Class之间函数的调用关系详解
Jan 23 Python
实例介绍Python中整型
Feb 11 Python
详解Python装饰器
Mar 25 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
May 29 Python
python 同时读取多个文件的例子
Jul 16 Python
如何通过python实现全排列
Feb 11 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
Oct 20 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的FTP学习(二)[转自奥索]
2006/10/09 PHP
表单复选框向PHP传输数据的代码
2007/11/13 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
小程序实现悬浮搜索框
2019/07/12 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
自我鉴定的范文
2013/10/03 职场文书
2014村务公开实施方案
2014/02/25 职场文书
网络管理员岗位职责
2014/03/17 职场文书
汽车维修求职信
2014/06/15 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
劳动仲裁调解书
2015/05/20 职场文书
暑期家教宣传单
2015/07/14 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server
java版 简单三子棋游戏
2022/05/04 Java/Android