ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python 类 __slots__ & 私有变量

2021-05-04 18:33:47  阅读:146  来源: 互联网

标签:__ Python self update slots class 属性


__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__ 的直接引用。

参考

  1. https://www.liaoxuefeng.com/wiki/1016959663602400/1017501655757856
  2. https://www.python.org/dev/peps/pep-0412/
  3. https://docs.python.org/zh-cn/3/tutorial/classes.html#private-variables

标签:__,Python,self,update,slots,class,属性
来源: https://www.cnblogs.com/zyl007/p/14729991.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有