最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python3中类属性slots的常见疑问有哪些?

    正文概述    2020-06-09   227

    Python3中类属性slots的常见疑问有哪些?

    电脑用的时间久了,内存慢慢的就不够用,运行起来也会比较卡。与其想着无限加大电脑的内存,不如换一种思路,如何把电脑的内存释放出来。python3中的slots就是用来减少内存占用的,不过在使用的时候,小伙伴们知道需要注意哪些方面吗?小编今天把需要注意的地方都整理了出来,大家一起看看吧。


    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__': <function __main__.Y.__init__(self, a, b)>,
                  'a': <member 'a' of 'Y' objects>,
                  'b': <member 'b' of 'Y' objects>,
                  '__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
    <weakref at 0x107d17d68; to 'Y' at 0x107a4d480>

    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'


    看来想要成功给电脑释放内存并不是一件容易的事情,这些常见的slots疑问点大家一定要牢记哦~更多Python学习推荐:起源地模板网教学中心


    起源地下载网 » Python3中类属性slots的常见疑问有哪些?

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元