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实现身份证号码解析
Sep 01 Python
python通过文件头判断文件类型
Oct 30 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
python3中int(整型)的使用教程
Mar 23 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
Python实现简单的列表冒泡排序和反转列表操作示例
Jul 10 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 Python
用 Django 开发一个 Python Web API的方法步骤
Dec 03 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自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
PHP之header函数详解
2021/03/02 PHP
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
python文件和目录操作方法大全(含实例)
2014/03/12 Python
python正则分析nginx的访问日志
2017/01/17 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
pytorch的batch normalize使用详解
2020/01/15 Python
Python异常继承关系和自定义异常实现代码实例
2020/02/20 Python
详解Python多线程下的list
2020/07/03 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
美国高档帽子网上商店:Hats.com
2018/08/09 全球购物
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
给水工程专业毕业生自荐信
2014/01/28 职场文书
中学家长会邀请函
2014/02/03 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
指导教师推荐意见
2015/06/05 职场文书
同事欢送会致辞
2015/07/31 职场文书