强制python类使用'\'u slots''
slotted的Python项目详细描述
强制python类使用__slots__,并提供pickling功能。在
示例
{1{1$在定义^ 2类时假定没有 空插槽,相当于声明__slots__ = ()。在
>>>fromslottedimportSlotted>>>classFoo(Slotted):...pass# implicit declaration of __slots__ = ()...>>>foo=Foo()>>>foo.bar=1Traceback(mostrecentcalllast):AttributeError:'Foo'objecthasnoattribute'bar'
时隙类具有酸洗支持:
^{pr2}$时隙类可以与常规类混合,只要它们和它们的所有基 实现__slots__。在
>>>fromslottedimportSlotted>>>classBar(object):...__slots__=("bar",)>>>classFoo(Bar,Slotted):...__slots__=("foo",)...>>>foo=Foo()
如果链中任何非Slotted类没有实现__slots__,则 TypeError异常被引发。在
>>>fromslottedimportSlotted>>>classBar(object):...pass>>>classFoo(Bar,Slotted):...__slots__=("foo",)...Traceback(mostrecentcalllast):TypeError:base'Bar'doesnotenforce'__slots__'
Slotted行为也可以通过使用SlottedMeta元类来实现。在
>>>fromslottedimportSlottedMeta>>>fromsiximportwith_metaclass>>>classFoo(with_metaclass(SlottedMeta,object)):...pass# implicit declaration of __slots__ = ()...>>>foo=Foo()>>>foo.bar=1Traceback(mostrecentcalllast):AttributeError:'Foo'objecthasnoattribute'bar'
在python3中,Slotted可以与collections.abc类混合,而不需要任何类 问题。但是,这些类并没有在Python2中定义插槽。为了工作 这个限制,您可以使用自动转换的SlottedABC类,如下所示:
>>>fromcollectionsimportMapping>>>fromslottedimportSlottedMapping>>>issubclass(SlottedMapping,Mapping)True>>>classFooMapping(SlottedMapping):...__slots__=("_d",)...def__init__(self):...self._d={"a":1,"b":2}...def__getitem__(self,item):...returnself._d[item]...def__iter__(self):...forkeyinself._d:...yieldkey...def__len__(self):...returnlen(self._d)...>>>m=FooMapping()>>>isinstance(m,Mapping)True>>>print(m["a"])1>>>m.bar="foo"Traceback(mostrecentcalllast):AttributeError:'FooMapping'objecthasnoattribute'bar'
- 项目
标签: