Python3中类属性slots的常见疑问以及解答示例
创始人
2024-11-19 16:21:21
0次

1.为什么 __slots__ 可以节省内存,提高速度的?

2.咋通过 __slots__ 来实现属性的存储与访问的?

3.使用了 __slots__ 的类怎么实现动态赋值,如果需要实例弱引用支持怎么搞?

4.使用了 __slots__ 的类继承与被继承时的表现?

针对这几个问题作答:

 1. 通常情况下,类实例使用 __dict__来存储其属性数据,好处是允许我们在运行时动态的设置实例属性,然而 dict 哈希表本身的数据结构决定了它需要更多的内存,当创建的实例越多,或者实例的属性越多时,内存的耗费将更加严重。__slots__ 保证了解释器在编译时期就知道这个类具有什么属性,以分配固定的空间来存储已知的属性。

 2.使用 __slots__ 时,会将属性的存储从实例的 __dict__ 改为类的 __dict__ 中:

>>> Y.__dict__
mappingproxy({'__module__': '__main__',
              '__slots__': ('a', 'b'),
              '__init__': ,
              'a': ,
              'b': ,
              '__doc__': None})

属性的访问是通过在类层级上为每个 slot 变量创建和 实现描述器(descriptor) 实现的,该描述器知道属性值在实例列表中的唯一位置。关于描述器与属性的访问在我的 走进 Python 类的内部 一文中均有详细的解释,感兴趣的同学可前去阅读。另外,这篇 how __slots__ are implemented 也许可以帮助你的理解,尽管我看它写于很多年前,但至今依然有借鉴意义。

 3.怎么实现动态赋值和弱引用支持?答案是:在 __slots__ 中加上 __dict__ 和 __weakref__。

class Y:
    __slots__ = ('a', 'b', '__dict__', '__weakref__')
 
    def __init__(self, a, b):
        self.a = a
        self.b = b
>>> import weakref
>>> y = Y(7, 8)
>>> y.a
7
>>> y.b
8
>>> y.c = 9
>>> y.__dict__
{'c': 9}
>>> ry = weakref.ref(y)
>>> ry

4.当类继承自一个未定义 __slots__ 的类时,实例的 __dict__ 和 __weakref__ 属性将总是可访问的。

class X:
    def __init__(self):
        self.a = 7
 
class Y(X):
    __slots__ = ('b', 'c')
 
    def __init__(self):
        super().__init__()
        self.b = 8
        self.c = 9
>>> y = Y()
>>> y.a
7
>>> y.b
8
>>> y.__dict__
{'a': 7}

5.在父类中声明的 __slots__ 在其子类中同样可用。不过,子类将会获得 __dict__ 和 __weakref__,除非它们也定义了 __slots__ 。

class X:
    __slots__=('a', 'b')
 
    def __init__(self):
        self.a = 7
        self.b = 8
 
class Y(X):
    """没有定义 __slots__"""
 
class Z(X):
    __slots__ = ()
>>> y = Y()
>>> y.a
7
>>> y.b
8
>>> y.c = 9
>>> y.__dict__
{'c': 9}
 
>>> z = Z()
>>> z.a
7
>>> z.b
8
>>> z.c = 9
AttributeError: 'Z' object has no attribute 'c'

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...