Python 类 __slots__ & 私有变量
2021/5/4 20:28:58
本文主要是介绍Python 类 __slots__ & 私有变量,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
__slots__
是什么/有什么作用
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。
如果我们想要限制实例的属性怎么办?
__slots__
是一种优化内存使用和速度性能的技术手段。可以用来限定对象属性名称。
__dict__
是对象的属性命名空间字典( attribute dictionaries)
如果我们定义了 __slots__
那么在对象使用过程中,只能列举__slots__
中的属性名称,这样可以避免内存的大量占用.
另外,一个重要的特性是,带有 __slots__
属性的实例通常不具有属性字典
__class__
与 __bases__
__class__
属性可以用于访问类实例所属的类( instance.__class__
),__bases__
属性则可以用于访问由类对象的基类所组成的元组
>>> foo.__class__ <class '__main__.Foo'> >>> Foo.__bases__ (<class 'object'>,)
私有变量
那种仅限从一个对象内部访问的“私有”实例变量在 Python 中并不存在。 但是,大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如 _spam) 应该被当作是 API 的非公有部分 (无论它是函数、方法或是数据成员)。 这应当被视为一个实现细节,可能不经通知即加以改变。
由于存在对于类私有成员的有效使用场景(例如避免名称与子类所定义的名称相冲突),因此存在对此种机制的有限支持,称为 名称改写。 任何形式为 __spam
的标识符(至少带有两个前缀下划线,至多一个后缀下划线)的文本将被替换为 _classname__spam
,其中 classname 为去除了前缀下划线的当前类名称。 这种改写不考虑标识符的句法位置,只要它出现在类定义内部就会进行。
名称改写有助于让子类重载方法而不破坏类内方法调用。例如:
class Mapping: def __init__(self, iterable): self.items_list = [] self.__update(iterable) def update(self, iterable): for item in iterable: self.items_list.append(item) __update = update # private copy of original update() method class MappingSubclass(Mapping): def update(self, keys, values): # provides new signature for update() # but does not break __init__() for item in zip(keys, values):
上面的示例即使在 MappingSubclass 引入了一个 __update
标识符的情况下也不会出错,因为它会在 Mapping 类中被替换为 _Mapping__update
而在 MappingSubclass 类中被替换为 _MappingSubclass__update
。
请注意,改写规则的设计主要是为了避免意外冲突;访问或修改被视为私有的变量仍然是可能的。这在特殊情况下甚至会很有用,例如在调试器中。
请注意传递给 exec() 或 eval() 的代码不会将发起调用类的类名视作当前类;这类似于 global 语句的效果,因此这种效果仅限于同时经过字节码编译的代码。 同样的限制也适用于 getattr()
, setattr()
和 delattr()
,以及对于 __dict__
的直接引用。
参考
- https://www.liaoxuefeng.com/wiki/1016959663602400/1017501655757856
- https://www.python.org/dev/peps/pep-0412/
- https://docs.python.org/zh-cn/3/tutorial/classes.html#private-variables
这篇关于Python 类 __slots__ & 私有变量的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20Python编程入门指南
- 2024-12-20Python编程基础与进阶
- 2024-12-19Python基础编程教程
- 2024-12-19python 文件的后缀名是什么 怎么运行一个python文件?-icode9专业技术文章分享
- 2024-12-19使用python 把docx转为pdf文件有哪些方法?-icode9专业技术文章分享
- 2024-12-19python怎么更换换pip的源镜像?-icode9专业技术文章分享
- 2024-12-19Python资料:新手入门的全面指南
- 2024-12-19Python股票自动化交易实战入门教程
- 2024-12-19Python股票自动化交易入门教程
- 2024-12-18Python量化入门教程:轻松掌握量化交易基础知识