暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python通过slots指定实例属性列表

原创 梯阅线条 2023-12-19
161

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'] >>> sc=SlotsC() # 使用前先赋值 >>> sc.title Traceback (most recent call last): File "<pyshell#23>", line 1, in <module> sc.title AttributeError: title >>> sc.title='梯阅线条' >>> sc.title '梯阅线条' # 实例只能创建在__slots__声明的属性 >>> sc.name='tyxt' Traceback (most recent call last): File "<pyshell#26>", line 1, in <module> sc.name='tyxt' AttributeError: 'SlotsC' object has no attribute 'name' # 类可以创建未在 __slots__ 声明的属性 >>> SlotsC.name='tyxt' >>> SlotsC.name 'tyxt' >>> class C:pass # 未定义__slots__,实例有 __dict__ 属性 >>> hasattr(C(),'__dict__') True # 定义__slots__后,实例不再有 __dict__ 属性 >>> hasattr(sc,'__dict__') False >>> hasattr(SlotsC,'__dict__') True

1.2 slots加dict

描述

python类实例只能创建slots声明的属性,如果slots包含__dict__,那么可以创建slots未声明的属性。

示例

>>> class DictC: __slots__=['title','__dict__'] a = 1 def __init__(self):self.b=2 >>> dc=DictC() >>> dc.title='梯阅线条' >>> dc.url='tyxt.work' >>> dc.__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):pass >>> b=B() >>> b.a,b.b=1,2 >>> b.__slots__ ['a'] >>> b.__dict__ {'b': 2}

1.3.2 父类无子类有slots

子类实例继承父类__dict__进行动态扩展属性,自身的__slots__属性不变。

示例

>>> class A:pass >>> class B(A):__slots__=['x'] >>> b=B() >>> b.x,b.y=1,2 >>> b.__slots__ ['x'] >>> b.__dict__ {'y': 2}

1.3.3 父类有子类有slots

子类__slots__覆盖父类,子类可访问slots中子类无父类有的属性。

>>> class A:__slots__=['x'] >>> class B(A):__slots__=['y'] >>> b=B() >>> b.__slots__ ['y'] >>> b.x,b.y=1,2 >>> b.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 <module> class C(A,B):pass TypeError: multiple bases have instance lay-out conflict

2 END

本文首发微信公众号:梯阅线条

更多内容参考python知识分享或软件测试开发目录。

文章转载自梯阅线条,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论