python槽怎么用 |
您所在的位置:网站首页 › python类怎么用 › python槽怎么用 |
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 |