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用GET方法上传文件
Mar 10 Python
Python数据类型详解(四)字典:dict
May 12 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
Python实现数值积分方式
Nov 20 Python
Python字节单位转换实例
Dec 05 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
安装Anaconda3及使用Jupyter的方法
Oct 27 Python
pytorch中的numel函数用法说明
May 13 Python
Python合并pdf文件的工具
Jul 01 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
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
jQuery动画效果图片轮播特效
2016/01/12 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
解析Python中的二进制位运算符
2015/05/13 Python
初步剖析C语言编程中的结构体
2016/01/16 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
python生成随机红包的实例写法
2019/09/02 Python
Python定义一个函数的方法
2020/06/15 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
中专毕业生的自我鉴定
2013/12/01 职场文书
顶岗实习计划书
2014/01/10 职场文书
销售团队激励口号
2014/06/06 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL