正常情况下,当我们定义了一个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实例添加nameage属性。

为了达到限制的目的,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__来限制类的实例属性的数量相关推荐

  1. Python高级编程:类和实例属性的查找顺序—mro查找

    一. mro查找定义 如果多个类继承父类,然后又被多个类继承这种复杂的问题,可以使用mro方法 class D:pass class C(D):pass class B(D):pass class A ...

  2. 学校(School)主要有3大角色:学校(School),讲师(Teacher),学员(Student)。请用Python语言简要实现这些类及及其属性,以及它们之间的关系。

    学校(School)主要有3大角色:学校(School),讲师(Teacher),学员(Student). 学校可以注册学员,统计有多少学员 讲师负责讲课 学生听课,提问,学习,交学费 Teacher ...

  3. python游戏脚本实例-python实现的简单文本类游戏实例

    本文实例讲述了python实现的简单文本类游戏实现方法.分享给大家供大家参考.具体实现方法如下: ################################################### ...

  4. Python类的实例属性详解

    实例属性 1.类被实例化后才会具有的属性 2.一般在_init_()方法中创建并初始化 3.直接使用即定义:self.<属性名> 4.引用方法:self.<属性名> 5.sel ...

  5. Pyhton类、实例属性的获取和设置

    由于python是一种动态语言,python类和属性的获取和设置非常灵活,本文主要介绍一下几个方面: 实例属性和类属性的绑定:动态绑定属性和方法:__slots__ 的使用:@property的使用 ...

  6. 类的实例属性和类属性的区别

    类的属性类和实例都可以访问,实例的属性类不可以访问只有类能访问,他们的定义方式也不同: 类属性的定义: class A(objects): version=1.2             #类属性的定 ...

  7. (转载)js对象原来也有类、实例属性和原型属性

    <html>     <head>     <meta http-equiv="Content-Type"content="text/htm ...

  8. Thread 和 Runnable创建新线程的区别,Runnable可以共享线程类的实例属性

    Thread实现多线程: public class Thread2 extends Thread{ public  int i; public void run(){ for(; i < 100 ...

  9. python对象编程例子-python面向对象编程:python类和实例讲解

    东尧爱分享 这是东尧每天一篇文章的第51天 东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福. 1 什么是对象 在python里面,一切皆为对象.也就是说python里的所有数据都 ...

最新文章

  1. 简单的Windows资源管理器——Java版本
  2. python2升级_把Python2.6升级到Python2.7(适用于把Python2升级到Python3)
  3. NameServer的启动
  4. Centos修改文件打开数限制
  5. Element-UI中Drawer抽屉去除标题自带蓝色框
  6. P4301 [CQOI2013] 新Nim游戏
  7. redis 槽点重新分配 集群_弄懂一致性哈希后我打通了redis分区集群的原理
  8. php是fast_cgi模式,cpanel中的php运行方式使用fast-cgi模式的配置方法
  9. python网络爬虫爬取视频_Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!...
  10. 17复变函数的积分(三)
  11. 创作gtk源码级vim帮助文档 tags
  12. 关于APS生产排产软件选择,有哪几个要素?
  13. ESP8266-Arduino网络编程实例-BME280传感器数据仪表显示
  14. 毕业论文外文文献在哪里找?
  15. 在excel中如何筛选重复数据_高级筛选,让重复的数据记录无处可逃
  16. 虚幻4引擎开发使用感受
  17. java进阶之多线程二线程池
  18. 我的电脑硬盘由SSD+HD组合,在HD上成功安装CentOS6.9
  19. VS2019怎么没有C++的窗体应用模板_简历中常被忽视的「自我评价」,怎么写?
  20. 你这简历一看就是包装过的

热门文章

  1. Python-OpenCV 笔记2 -- 图像的基本属性和操作
  2. 工业用微型计算机(21)-指令系统(17)
  3. 工业用微型计算机笔记(5)-指令系统(2)
  4. tensorflow随笔-正则化与指数衰减率
  5. 【机器学习】机器学习模型验证,这3个 Python 包可轻松解决95%的需求!
  6. 【深度学习】图像去噪:一种基于流的图像去噪神经网络
  7. 【NLP】NLP实战篇之bert源码阅读(run_classifier)
  8. 【Python基础】使用列表、字典和集合生成式来缩短代码
  9. 【Python基础】Python 面向对象编程(下篇)
  10. 清晰易懂的马尔科夫链原理介绍