python __slots__ 详解(下篇)

2024-03-03 13:48
文章标签 python 详解 下篇 slots

本文主要是介绍python __slots__ 详解(下篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。

from types import MethodType
class student(object):#先定义类studentpasss=student()
s.name='python' #动态给实例绑定一个属性
print 's.name=',s.name
def set_age(self,age):#定义一个函数(作为实例方法)self.age=age
s.set_age=MethodType(set_age,s,student)#给实例绑定一个方法    
s.set_age(26) #调用实例方法
print 's.age=',s.age  #测试结果
#注意:给一个实例绑定的变量和方法,对另一个实例不起作用
#为实例s绑定的变量name和方法set_age()对另一个实例s2不起作用
s2=student()
#print s2.name#AttributeError: 'student' object has no attribute 'name'   
#s2.set_age(23)#AttributeError: 'student' object has no attribute 'set_age' 
#若将变量和方法绑定到class上,则所有的实例均可访问
def set_score(self,score):#定义一个函数(绑定到类上)self.score=score
#绑定一个方法到class上,绑定之后,所有的实例均可调用
student.set_score=MethodType(set_score,None,student)
s.set_score(88)
s2.set_score(99)
print s.score,s2.score
运行结果:
s.name= python
s.age= 26
88 99
通常情况下,上面的set_score方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,
这在静态语言中很难实现。
但是,如果我们想要限制class的属性怎么办?比如,只允许对student类的实例添加name和age属性。
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性,如下:

class student(object):  __slots__=('name','age')#用tuple定义允许绑定的属性名称       s=student()#创建新的实例  
s.name='python'  
s.age=23  
print 's.name=',s.name,'s.age=',s.age  
#s.score=99 #AttributeError: 'student' object has no attribute 'score'     
''''' 
由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。 
使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对其子类是不起作用的! 
也就是说,我们可以为子类实例动态绑定任意变量和方法 ,如下: 
'''  
class graduateStudent(student):  pass  
g=graduateStudent()  
print dir(g) #可以看到,实例g结构中包含__dict__属性,因此可以为实例g任意的添加属性!
g.score=99#动态给实例绑定一个属性  
print g.score  

运行结果:
s.name= python s.age= 23
['__class__', '__delattr__', ' __dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name']
99
如果父类和子类中都定义__slots__,这样,子类允许定义的属性就是 自身的__slots__加上父类的__slots__。如下:

class student(object):__slots__=('name','age')#用tuple定义允许绑定的属性名称     class graduateStudent(student):__slots__=('x','y')g=graduateStudent()
#子类允许定义的属性就是自身的__slots__加上父类的__slots__
g.name='python'
g.age=23
g.x=11
g.y=33
print g.name,g.age,g.x,g.y
#g.score=100 #AttributeError: 'graduateStudent' object has no attribute 'score'
运行结果:
python 23 11 33

class A(object):pass
class B(A):__slots__=('x')print dir(A)#可以看到A类有一个__dict__属性
print dir(B)#B类也有一个__dict__属性(继承了父类A中的__dict__属性)  
b=B()
b.x=9
print 'b.x=',b.x
b.y=8 #B类包含了__dict__属性,其实例可以任意添加属性
print 'b.y=',b.y
运行结果:
['__class__', '__delattr__', ' __dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
['__class__', '__delattr__', ' __dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__weakref__', 'x']
b.x= 9
b.y= 8

class A(int):__slots__=('x')print dir(int)#可以看到,int类不包含__dict__属性(python中的内建类型不包含__dict__属性)
print dir(A)#A类也不包含__dict__属性,但包含__slots__属性(因此A类的实例可以添加的属性局限于__slots__)
a=A()
a.x=78
print 'a.x=',a.x
#a.y=98 #AttributeError: 'A' object has no attribute 'y'
运行结果:
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__module__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', ' __slots__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real', 'x']
a.x= 78
综上所述:
如果 父类存在__dict__属性,则其子类将继承__dict__;此时,即使该子类包含了__slots__属性, 该子类的实例依然可以任意添加变量


(完)




这篇关于python __slots__ 详解(下篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/769801

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML