python 使用__slots__来限制类的实例属性的数量
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:
class Student(object):pass
然后,尝试给实例绑定一个属性:
>>> s = Student()
>>> s.name = 'Michael' # 动态给实例绑定一个属性
>>> print(s.name)
Michael
还可以尝试给实例绑定一个方法:
>>> def set_age(self, age): # 定义一个函数作为实例方法
... self.age = age
...
>>> from types import MethodType
>>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
>>> s.set_age(25) # 调用实例方法
>>> s.age # 测试结果
25
但是,给一个实例绑定的方法,对另一个实例是不起作用的:
>>> s2 = Student() # 创建新的实例
>>> s2.set_age(25) # 尝试调用方法
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'set_age'
为了给所有实例都绑定方法,可以给class绑定方法:
>>> def set_score(self, score):
... self.score = score
...
>>> Student.set_score = set_score
给class绑定方法后,所有实例均可调用:
>>> s.set_score(100)
>>> s.score
100
>>> s2.set_score(99)
>>> s2.score
99
通常情况下,上面的set_score
方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现。
使用__slots__
但是,如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name
和age
属性。
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__
变量,来限制该class实例能添加的属性:
class Student(object):__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
然后,我们试试:
>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'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 GraduateStudent(Student):
... pass
...
>>> g = GraduateStudent()
>>> g.score = 9999
除非在子类中也定义__slots__
,这样,子类实例允许定义的属性就是自身的__slots__
加上父类的__slots__
。
源码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-class Student(object):__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称class GraduateStudent(Student):passs = Student() # 创建新的实例
s.name = 'Michael' # 绑定属性'name'
s.age = 25 # 绑定属性'age'
# ERROR: AttributeError: 'Student' object has no attribute 'score'
try:s.score = 99
except AttributeError as e:print('AttributeError:', e)g = GraduateStudent()
g.score = 99
print('g.score =', g.score)
参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017501655757856
python 使用__slots__来限制类的实例属性的数量相关推荐
- Python高级编程:类和实例属性的查找顺序—mro查找
一. mro查找定义 如果多个类继承父类,然后又被多个类继承这种复杂的问题,可以使用mro方法 class D:pass class C(D):pass class B(D):pass class A ...
- 学校(School)主要有3大角色:学校(School),讲师(Teacher),学员(Student)。请用Python语言简要实现这些类及及其属性,以及它们之间的关系。
学校(School)主要有3大角色:学校(School),讲师(Teacher),学员(Student). 学校可以注册学员,统计有多少学员 讲师负责讲课 学生听课,提问,学习,交学费 Teacher ...
- python游戏脚本实例-python实现的简单文本类游戏实例
本文实例讲述了python实现的简单文本类游戏实现方法.分享给大家供大家参考.具体实现方法如下: ################################################### ...
- Python类的实例属性详解
实例属性 1.类被实例化后才会具有的属性 2.一般在_init_()方法中创建并初始化 3.直接使用即定义:self.<属性名> 4.引用方法:self.<属性名> 5.sel ...
- Pyhton类、实例属性的获取和设置
由于python是一种动态语言,python类和属性的获取和设置非常灵活,本文主要介绍一下几个方面: 实例属性和类属性的绑定:动态绑定属性和方法:__slots__ 的使用:@property的使用 ...
- 类的实例属性和类属性的区别
类的属性类和实例都可以访问,实例的属性类不可以访问只有类能访问,他们的定义方式也不同: 类属性的定义: class A(objects): version=1.2 #类属性的定 ...
- (转载)js对象原来也有类、实例属性和原型属性
<html> <head> <meta http-equiv="Content-Type"content="text/htm ...
- Thread 和 Runnable创建新线程的区别,Runnable可以共享线程类的实例属性
Thread实现多线程: public class Thread2 extends Thread{ public int i; public void run(){ for(; i < 100 ...
- python对象编程例子-python面向对象编程:python类和实例讲解
东尧爱分享 这是东尧每天一篇文章的第51天 东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福. 1 什么是对象 在python里面,一切皆为对象.也就是说python里的所有数据都 ...
最新文章
- 简单的Windows资源管理器——Java版本
- python2升级_把Python2.6升级到Python2.7(适用于把Python2升级到Python3)
- NameServer的启动
- Centos修改文件打开数限制
- Element-UI中Drawer抽屉去除标题自带蓝色框
- P4301 [CQOI2013] 新Nim游戏
- redis 槽点重新分配 集群_弄懂一致性哈希后我打通了redis分区集群的原理
- php是fast_cgi模式,cpanel中的php运行方式使用fast-cgi模式的配置方法
- python网络爬虫爬取视频_Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!...
- 17复变函数的积分(三)
- 创作gtk源码级vim帮助文档 tags
- 关于APS生产排产软件选择,有哪几个要素?
- ESP8266-Arduino网络编程实例-BME280传感器数据仪表显示
- 毕业论文外文文献在哪里找?
- 在excel中如何筛选重复数据_高级筛选,让重复的数据记录无处可逃
- 虚幻4引擎开发使用感受
- java进阶之多线程二线程池
- 我的电脑硬盘由SSD+HD组合,在HD上成功安装CentOS6.9
- VS2019怎么没有C++的窗体应用模板_简历中常被忽视的「自我评价」,怎么写?
- 你这简历一看就是包装过的
热门文章
- Python-OpenCV 笔记2 -- 图像的基本属性和操作
- 工业用微型计算机(21)-指令系统(17)
- 工业用微型计算机笔记(5)-指令系统(2)
- tensorflow随笔-正则化与指数衰减率
- 【机器学习】机器学习模型验证,这3个 Python 包可轻松解决95%的需求!
- 【深度学习】图像去噪:一种基于流的图像去噪神经网络
- 【NLP】NLP实战篇之bert源码阅读(run_classifier)
- 【Python基础】使用列表、字典和集合生成式来缩短代码
- 【Python基础】Python 面向对象编程(下篇)
- 清晰易懂的马尔科夫链原理介绍