Python ABCs: registro vs. subclasificación

(Estoy usando python 2.7) La documentación de python indica que puede pasar una asignación al dictado incorporado y copiará esa asignación en el nuevo dict:

http://docs.python.org/library/stdtypes.html#mapping-types-dict

Tengo una clase que implementa el Mapeo ABC, pero falla:

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 "", line 1, in  # TypeError: cannot convert dictionary update sequence element #0 to a sequence collections.Mapping.register(Mapping) dict(m) # Traceback (most recent call last): # File "", line 1, in  # TypeError: cannot convert dictionary update sequence element #0 to a sequence 

Sin embargo, si mis subclases de clase son colecciones.Mapping entonces funciona bien:

 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} 

Pensé que el objective principal de los ABCs era permitir que el registro funcionara igual que la subclasificación (para isinstance y issubclass de todos modos). Entonces, ¿qué pasa aquí?

El registro no le brinda los “métodos que faltan” implementados además de los que usted define: de hecho, el registro no es invasivo con respecto al tipo que está registrando: no se le agrega nada, no se elimina nada, no se altera nada . Solo afecta a los controles de isinstance y de issubclass : nada más, nada menos.

Subclasificar un ABC puede y le brinda muchos métodos implementados “de forma gratuita” por el ABC, además de los que debe definir usted mismo.

La semántica de una operación que es totalmente no invasiva como el registro, en comparación con las de una operación que pretende enriquecer una clase, como la subclasificación, obviamente no puede ser idéntica; por lo tanto, su comprensión de “todo el punto del ABC” es imperfecta; el ABC tiene dos puntos, uno obtenido por subclasificación (“invasivo”), uno por registro (no invasivo).

Tenga en cuenta que siempre puede multiplicar-heredar si ya tiene una clase como su Mapping original: class GoogMapping(Mapping, collections.Mapping): ... le dará los mismos resultados que heredando Mapping directamente de collections.Mapping – un nuevo Escriba con todos los métodos auxiliares agregados por collections.Mapping .

Ah, parece que dict () está buscando el método de las teclas … No usa el ABC.