python__slots__,python _slots_

  python__slots__,python _slots_

  电脑用久了,内存慢慢就不够用了,运行起来更可靠。与其想着增加电脑的内存,不如换个思路想想怎么释放电脑的内存。python3中的Slots是用来减少内存占用的,但是在使用的时候,朋友们知道需要注意哪些方面吗?边肖已经整理出今天所有需要注意的地方。让我们看一看。

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

  2.如何通过__slots__存储和访问属性?

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

  4.使用__slots__的类继承和继承时的性能?

  回答这些问题:

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

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

  Y.__词典_ _

  mapping proxy({ _ _ module _ _ : _ _ main _ _ ,

  __slots__:(a , b ),

  铌

  sp;'__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__。

  

classY:

  __slots__=('a','b','__dict__','__weakref__')

  

  def__init__(self,a,b):

  self.a=a

  self.b=b

  >>>importweakref

  >>>y=Y(7,8)

  >>>y.a

  7

  >>>y.b

  8

  >>>y.c=9

  >>>y.__dict__

  {'c':9}

  >>>ry=weakref.ref(y)

  >>>ry

  <weakrefat0x107d17d68;to'Y'at0x107a4d480>

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

  

classX:

  def__init__(self):

  self.a=7

  

  classY(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__ 。

  

classX:

  __slots__=('a','b')

  

  def__init__(self):

  self.a=7

  self.b=8

  

  classY(X):

  """没有定义__slots__"""

  

  classZ(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'objecthasnoattribute'c'


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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: