• python-开放类优化内存性能


    开放类:在运行期间,可动态向实例或类添加新成员,方法

    1.实例不能添加方法到类,反之可以

    class A: pass
    
    a = A()
    
    a.func = lambda x: x+1
    
    a.func  # <function <lambda>>
    
    A.func  # AttributeError: type object 'A' has no attribute 'func'

    2.object类,不能添加任何成员,也没有普通类的__dict__方法

    2.1SimpleNamespace简单继承object,其作用用来代替 class X: pass 语句

    import types
    o = types.SimpleNamespace(a=1,b=2)
    print(o.__dict__)
    o.c=3
    print(o.__dict__)
    
    >>>
    {'a': 1, 'b': 2}
    {'a': 1, 'b': 2, 'c': 3}

    3. __slots__类属性,用来处理 内存和性能 问题

    对于需要创建海量实例的类来说,可以通过设置__slots__,阻止实例(类依然可以添加方法)创建__dict__等成员。解释器只为__slots__指定的成员分配空间。

    class A:
        __slots__ = ['x','y']  # only two members
    >>> >>> a
    = A() >>> a.x = lambda x:x+1 >>> a.y = 2 >>> print(a.x(3)) >>> print(A.__dict__) # 实例a 没有__dict__属性了
    # 结果
    4
    {'__module__': '__main__', '__slots__': ['x', 'y'], 'x': <member 'x' of 'A' objects>, 'y': <member 'y' of 'A' objects>, '__doc__': None}

    >>> a.z=3
    # AttributeError: 'A' object has no attribute 'z'

    继承拥有__slots__属性的类,依然需要指定__slots__为空,或新增某些属性

    --------------------------------------------------------------------------------------------

    因为__slots__阻止了实例创建__dict__等成员,所以对于需要大量实例化的类来讲,就节约了大量的内存

  • 相关阅读:
    WinForm高级控件--PictureBox控件(图片控件)
    改变GridView中列的宽度
    RabbitMq笔记()
    参数可传可不传
    C# 视频讲解
    <ItemTemp>里写判断语句
    MyEclipse 2017 CI 10 发布(附下载)
    DevExpress v17.2新版亮点—WPF篇(四)
    DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储
    MyEclipse移动开发教程:设置所需配置的iOS应用(三)
  • 原文地址:https://www.cnblogs.com/tangpg/p/9578995.html
Copyright © 2020-2023  润新知