博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
8.python之面相对象part.8(__slots__属性)
阅读量:6670 次
发布时间:2019-06-25

本文共 1377 字,大约阅读时间需要 4 分钟。

一.__slots__属性有什么作用?为什么要有__slots__属性。

首先来说一说__slots__是什么,__slots__是一个类变量,它里面的值可以是字符串,可以是列表,可以是元组。(如果__slots__这个属性的值为一个字符串,那么意为着这个类生成的对象,只能有一个属性)。

那么为什么要用__slots__属性呢?

关于这个问题还要从每个对象的__dict__属性开始说起。

当使用.点来访问属性本质就是在访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例的是独立的),如果一个类,生成了很多的对象,每生成一个对象时,都会为这个对象生成一个__dict__属性字典,如果有很多类就会生成很多的字典,会占用很多的内存空间。

如果你有一个属性很少的类,但是有很多实例,为了节省内存可以使用__slots__取代实例的__dict__啦~

当你定义__slots__后,__slots__就会为实例使用一种更加紧凑的内部表示。实例通过一个很小的固定大小的数组来构建,而不是为每个实例定义一个字典。

这跟元组或列表很类似。在__slots__中列出的属性名在内部被映射到这个数组的指定小标上。

!!使用__slots__的一个缺点就是我们不能再给实例添加新的属性了,只能使用在__slots__中定义的那些属性名。这点是非常值得注意的!!

二.关于使用__slots__属性的主意事项。

  1. 使用__slots__属性后,无法在给对象添加新的属性!只能使用在类中__slots__属性中定义的属性名!!!

  2. 定义了__slots__属性后的类,将不再具备普通类的一些特性,比如:多继承。大多数情况下,你应该明确,某些在程序中会创建几百万个对象的类,就需要使用__slots__属性,并且只在那些经常被使用到 的用作数据结构的类上定义__slots__。

三.关于__slots__的一些补充。

关于__slots__的一个常见误区是它可以作为一个封装工具来防止用户给实例增加新的属性。尽管使用__slots__可以达到这样的目的,但是这个并不是它的初衷。 更多的是用来作为一个内存优化工具。

四.关于__slots__的使用方法演示。

例1:

class Foo:

    __slots__='x'

f1=Foo()

f1.x=1

f1.y=2#报错

print(f1.__slots__) #f1不再有__dict__

class Bar:

    __slots__=['x','y']

    

n=Bar()

n.x,n.y=1,2

n.z=3#报错

例2:(__slots__特性的验证)

class Foo:

    __slots__=['name','age']

f1=Foo()

f1.name='alex'

f1.age=18

print(f1.__slots__)

f2=Foo()

f2.name='egon'

f2.age=19

print(f2.__slots__)

print(Foo.__dict__)

#f1与f2都没有属性字典__dict__了,统一归__slots__管,节省内存

      本文转自苏浩智 51CTO博客,原文链接:http://blog.51cto.com/suhaozhi/1918562,如需转载请自行联系原作者

你可能感兴趣的文章
javascript引擎执行的过程的理解--语法分析和预编译阶段
查看>>
百度正式发布PaddlePaddle深度强化学习框架PARL
查看>>
迟到但重要的事
查看>>
Node.js 指南(不要阻塞事件循环或工作池)
查看>>
Java抽象类与接口的区别
查看>>
一张图让自己搞懂(mēng)原型&原型链
查看>>
前端每日实战:75# 视频演示如何用纯 CSS 创作一支摇曳着烛光的蜡烛
查看>>
.NET或将引入类型类和扩展
查看>>
Windows 使用 ln -s 创建软链接
查看>>
来看一场 AI 重建的 3D 全息世界杯比赛!
查看>>
动态权限<三>华为小米特殊机制
查看>>
Python黑帽编程2.6 模块
查看>>
远端访问MySQL
查看>>
f(f(x))=-x, x是Int32,这类函数的抽象理解
查看>>
[LeetCode] Longest Consecutive Sequence
查看>>
CentOs~程序部署那些事
查看>>
关于查询扩展版ESI高被引论文的说明
查看>>
亚信安全与成都市政府达成战略合作
查看>>
SSH::Batch,在公有云中使用 ssh 工具箱
查看>>
“外围”消亡 企业安全防护需要新形态
查看>>