python槽怎么用

您所在的位置:网站首页 python类怎么用 python槽怎么用

python槽怎么用

2023-03-09 04:23| 来源: 网络整理| 查看: 265

python

槽怎么⽤

_python

特性

slots

槽详解

槽(slots)可以使⽤__slots_属性来为⾃定的类设置以⼀个静态属性列表,并在类的每个实例中跳过__dict__字典的创建过程,可以提⾼访问

速度,节省内存消耗

由于Python是动态语⾔,任何实例在运⾏期都可以动态地添加属性。

如果要限制添加的属性,例如,Student类只允许添加 name、gender和score 这3个属性,就可以利⽤Python的⼀个特殊的__slots__来

实现

class Student(object):

__slots__ = ('name', 'gender', 'score')

def __init__(self, name, gender, score):

self.name = name

self.gender = gender

self.score = score

创建实例,并向其中新增属性

>>> s = Student('Bob', 'male', 59)

>>> s.name = 'Tim' # OK

>>> s.score = 99 # OK

>>> s.grade = 'A'

新增属性grade执⾏后,抛异常【AttributeError: 'student' object has no attribute 'gride'】

当⼀个Student类定义了__slots__ = ('name', 'age'),Studen.name就是⼀个有__get__和__set__⽅法的member_descriptor

__slots__的⽬的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使⽤__slots__也能节省内存。

__slots__两⼤特性

更快的属性访问速度

默认情况下,访问⼀个实例的属性是通过访问该实例的__dict__来实现的。如访问s.name就相当于访问s.__dict__['name']。为了便于理

解,我粗略地将它拆分为四步:s.name  >> s.__dict__ >>. s.__dict__['name'] >>. 结果

从__slots__的实现可以得知,定义了__slots__的类会为每个属性创建⼀个描述器。访问属性时就直接调⽤这个描述器。在这⾥我将它拆分

为三步:b.x >>. member decriptor >>. 结果

我在上⽂提到,访问__dict__和描述器的速度是相近的,⽽通过__dict__访问属性多了s.__dict__['name']字典访值⼀步(⼀个哈希函数的消

耗)。由此可以推断出,使⽤了__slots__的类的属性访问速度⽐没有使⽤的要快。下⾯⽤⼀个例⼦验证:

from timeit import repeat

class A(object): pass

class B(object): __slots__ = ('x')

def get_set_del_fn(obj):

def get_set_del():

obj.x = 1

obj.x

del obj.x



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3