Eri*_*now 5 python subclass abstract-base-class
(我使用的是python 2.7)python文档表明你可以将映射传递给内置的dict,它会将该映射复制到新的dict中:
http://docs.python.org/library/stdtypes.html#mapping-types-dict
我有一个实现Mapping ABC的类,但它失败了:
import collections
class Mapping(object):
def __init__(self, dict={}): self.dict=dict
def __iter__(self): return iter(self.dict)
def __iter__(self): return iter(self.dict)
def __len__(self): return len(self.dict)
def __contains__(self, value): return value in self.dict
def __getitem__(self, name): return self.dict[name]
m=Mapping({5:5})
dict(m)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence
collections.Mapping.register(Mapping)
dict(m)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence
Run Code Online (Sandbox Code Playgroud)
但是,如果我的类继承collections.Mapping,那么它可以正常工作:
import collections
class Mapping(collections.Mapping):
def __init__(self, dict={}): self.dict=dict
def __iter__(self): return iter(self.dict)
def __iter__(self): return iter(self.dict)
def __len__(self): return len(self.dict)
def __contains__(self, value): return value in self.dict
def __getitem__(self, name): return self.dict[name]
m=Mapping({5:5})
dict(m)
# {5: 5}
Run Code Online (Sandbox Code Playgroud)
我认为ABCs的重点是允许注册与子类化一样工作(无论如何,对于isinstance和issubclass).那么这里有什么?
注册不会为您提供在您定义的基础上实现的"缺失方法":实际上,注册对于您正在注册的类型是非侵入性的 - 没有任何内容被添加到其中,没有任何内容被删除,没有任何内容被更改.它只会影响isinstance和issubclass检查:仅此而已.
对ABC进行子类化可以并且确实为您提供了大量的方法,这些方法由ABC在您必须自己定义的基础上"免费"实施.
与那些旨在丰富类的操作(如子类化)相比,像注册一样完全非侵入性的操作的语义显然不能相同; 所以你对"ABCs的全部要点"的理解是不完美的 - ABCs有两个点,一个通过子类化("侵入性")获得,一个通过注册(非侵入性)获得.
请注意,您可以随时多重继承,如果你已经有一个像你原来的一类Mapping:class GoogMapping(Mapping, collections.Mapping): ...会给你同样的结果继承Mapping直接从collections.Mapping-一种新型的具有由添加了所有的辅助方法collections.Mapping.
| 归档时间: |
|
| 查看次数: |
1638 次 |
| 最近记录: |