百度推广网址,网站优化外包价格,山东锦华建设集团有限公司网站,手机网站上线左右滑动1 python通过slots指定实例属性列表
python类通过__slots__属性列表#xff0c;指定类实例可以创建的属性。
1.1 slots基础
用法 class SlotsC:__slots__[attr1,...,attrn]描述
#xff08;1#xff09; 实例只能创建__slots__列表内声明的属性#xff1…1 python通过slots指定实例属性列表
python类通过__slots__属性列表指定类实例可以创建的属性。
1.1 slots基础
用法 class SlotsC:__slots__[attr1,...,attrn]描述
1 实例只能创建__slots__列表内声明的属性
2 实例属性必须在引用前进行赋值
3 定义了__slots__属性的类的实例不再有__dict__属性所以不能创建slots外的属性
4 定义了__slots__属性的类有__dict__属性所以可以创建slots外的属性
示例 class SlotsC:__slots__[title,url]scSlotsC()
# 使用前先赋值sc.title
Traceback (most recent call last):File pyshell#23, line 1, in modulesc.title
AttributeError: titlesc.title梯阅线条sc.title
梯阅线条
# 实例只能创建在__slots__声明的属性sc.nametyxt
Traceback (most recent call last):File pyshell#26, line 1, in modulesc.nametyxt
AttributeError: SlotsC object has no attribute name
# 类可以创建未在 __slots__ 声明的属性SlotsC.nametyxtSlotsC.name
tyxtclass C:pass
# 未定义__slots__实例有 __dict__ 属性hasattr(C(),__dict__)
True
# 定义__slots__后实例不再有 __dict__ 属性hasattr(sc,__dict__)
Falsehasattr(SlotsC,__dict__)
True1.2 slots加dict
描述
python类实例只能创建slots声明的属性如果slots包含__dict__那么可以创建slots未声明的属性。
示例 class DictC:__slots__[title,__dict__]a 1def __init__(self):self.b2dcDictC()dc.title梯阅线条dc.urltyxt.workdc.__dict__
{b: 2, url: tyxt.work}dc.url
tyxt.work
# 列出所有实例属性for attr in list(getattr(dc,__dict__,[]))getattr(dc,__slots__,[]):print(attr,,getattr(dc,attr))
b 2
url tyxt.work
title 梯阅线条
__dict__ {b: 2, url: tyxt.work}1.3 python超类的slots
1.3.1 父类有子类无slots
子类实例继承父类__slots__属性并且自动创建__dict__用于动态扩展属性。
示例 class A:__slots__[a]class B(A):passbB()b.a,b.b1,2b.__slots__
[a]b.__dict__
{b: 2}1.3.2 父类无子类有slots
子类实例继承父类__dict__进行动态扩展属性自身的__slots__属性不变。
示例 class A:passclass B(A):__slots__[x]bB()b.x,b.y1,2b.__slots__
[x]b.__dict__
{y: 2}1.3.3 父类有子类有slots
子类__slots__覆盖父类子类可访问slots中子类无父类有的属性。 class A:__slots__[x]class B(A):__slots__[y]bB()b.__slots__
[y]b.x,b.y1,2b.x,b.y
(1, 2)1.3.4 多继承超类slots
只有一个超类有非空slots其他超类无slots或slots为空则情况同单继承。
若多个超类有非空slots则子类继承报错。
示例 class A:__slots__[x]class B:__slots__[y]class C(A,B):pass
Traceback (most recent call last):File pyshell#83, line 1, in moduleclass C(A,B):pass
TypeError: multiple bases have instance lay-out conflict