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实例添加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__

参考源码:

#python 使用__slots__     示例
#2016-8-29 21:25:14
#MengmengCoding
# -*- coding: utf-8 -*-#使用__slots__限制实例的属性class Student(object):__slots__=('name','age')    #用tuple定义允许绑定的属性名称#新类,继承于Student
class GraduateStudent(Student):passs=Student()        #创建新的实例
s.name='Shuke'    #绑定属性'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()    #创建新的实例
'''
使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,
对继承的子类是不起作用的
'''
g.score=99            #绑定属性'score'
print('g.score=',g.score)

转载于:https://www.cnblogs.com/codingmengmeng/p/5819891.html

python基础——使用__slots__相关推荐

  1. python代码大全和用法用量_python零基础入门命令方式汇总大全,快速恶补你的Python基础...

    原标题:python零基础入门命令方式汇总大全,快速恶补你的Python基础 无意中浏览到这篇来自大牛的分享,总结的很全面,我重新排版下放在这里,希望能帮助到大家.在此十分感谢原作者! 在开始之前还是 ...

  2. python基础代码大全-python零基础入门命令方式汇总大全,快速恶补你的Python基础...

    原标题:python零基础入门命令方式汇总大全,快速恶补你的Python基础 无意中浏览到这篇来自大牛的分享,总结的很全面,我重新排版下放在这里,希望能帮助到大家.在此十分感谢原作者! 在开始之前还是 ...

  3. python基础教程廖雪峰云-Python3基础教程-廖雪峰[带标签完整版]

    标签: Python教程... 5 Python简介... 7 安装Python. 12 Python解释器... 16 第一个Python程序... 18 使用文本编辑器... 19 Python代 ...

  4. python基础个人总结

    1.Python的可变与不可变 不可变类型:数字.字符.元组(一旦改变,变量所指向的地址发生变化)可变类型:列表.字典.集合(在地址块内部进行修改,变量指向的地址不发生变化) 2.装饰器: def f ...

  5. python基础语法及知识点总结

    本文转载于星过无痕的博客http://www.cnblogs.com/linxiangpeng/p/6403991.html 在此表达对原创作者的感激之情,多谢星过无痕的分享!谢谢! Python学习 ...

  6. Python基础+进阶(万字总结,基础案例+执行结果)

    Python基础篇 第一章:基础语法 输出相关: 基本输出案例 print("HelloWorld")# 执行结果: ''' HelloWorld ''' 转义字符 # 转义字符& ...

  7. Python基础知识回顾

    python 基础汇总: 1.Python大小写敏感 2.Python是动态语言,即在定义变量时不需要指定变量类型 3.Python的整数合浮点数没有大小限制 4.python3 ,字符串是以Unic ...

  8. Python基础知识笔记

    文章目录 Python基础知识 教程:https://www.liaoxuefeng.com/wiki/1016959663602400 内置函数:https://docs.python.org/3/ ...

  9. Python基础教程,Python入门教程

    Python 是一门上手简单.功能强大.通用型的脚本编程语言.Python 类库极其丰富,这使得 Python 几乎无所不能,网站开发.软件开发.大数据分析.网络爬虫.机器学习等都不在话下. 这套 P ...

最新文章

  1. 《Python和Pygame游戏开发指南》——1.12 图书中的文本折行
  2. 导出excel——入门
  3. android唤醒前台,Android将后台应用唤起到前台的方法 (SDK 4.0, ActivityLifecycleCallbacks)...
  4. 关于默认jdk设置问题
  5. 分布式mysql保持数据一致性_一种分布式跨数据库保持事务一致性的方法及系统与流程...
  6. ES: 机器学习、专家系统、控制系统的数学映射
  7. KUKA---US2电源的安全属性-------老款硬线连接实现的DRIVE安全STO SBC 、新款基于Safety over EtherCAT 网络帧实现的DRIVE安全STO SBC
  8. 网站云服务器资料本地备份,云服务器上备份本地数据
  9. 83年的我刚好今年遇到了失业
  10. “对不起,我们只招有出色背景的技术人员!”
  11. Codeforces Round #162 (Div. 2): D. Good Sequences(DP)
  12. Android studio 设置默认打开项目,默认打开项目方式
  13. Linux 的虚拟文件系统(真正理解“一切皆文件”)
  14. 设计一函数,求整数区间[a,b]和[c,d]的交集
  15. 为程序界面添加滑动条
  16. 关于计算机动画制作的过程,关于计算机制作动画的过程
  17. Kindle 3---原系统下的字典的使用
  18. 夜神模拟器99%卡死打不开问题
  19. linux服务器console口,Linux重定向console口控制台
  20. ajax post forbidden,解决 Ajax 发送 post 请求出现 403 Forbidden 的三种方式

热门文章

  1. Windows下MongoDB安装及配置
  2. 远程协助TeamView软件 轻松控制计算机
  3. 拆分字符串使唯一子字符串的数目最大
  4. pipenv ModuleNotFoundError: No module named ‘virtualenv.seed.via_app_data‘
  5. puts函数,C语言puts函数用法详解
  6. if、for、while、do while、switch (区别于if、while)解析
  7. Android18isalone,全新JAVA开发Android程序员需要掌握的英语单词(很全).doc
  8. 通过pxe远程安装linux,通过PXE远程安装多台Linux系统
  9. python基础开发环境_Python基础教程,第一讲,开发环境搭建
  10. 凤凰涅槃:从 iBatis 到 MyBatis