重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
小编给大家分享一下Python3中类属性slots的常见疑问以及解答示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
创新互联公司专注于企业成都营销网站建设、网站重做改版、建华网站定制设计、自适应品牌网站建设、成都h5网站建设、商城网站制作、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为建华等各大城市提供网站开发制作服务。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'
以上是Python3中类属性slots的常见疑问以及解答示例的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!