2016-12-23 4 views
1

В чем разница между контейнером MappingView и контейнером с размерами? Любые примеры того, как реализовать контейнер MappingView?Понимание MappingView ABC

Возможно, я неправильно понял ABC и docs, но контейнер MappingView - это любой контейнер, который наследуется от Sized, правильно? Если да, то почему мой манекен не работает?

import collections 

class MySized: 
    def __len__(): 
     pass 

class MyMappingView(MySized): 
    pass 

print(issubclass(MySized, collections.Sized)) # True 
print(issubclass(MyMappingView, collections.MappingView)) # False 

ответ

0

Потому что вы не подклассы от него (фактически или иначе). MappingView используется как базовый класс для просмотров keys/items/values. Sized используется для любого объекта, для которого получение его размера (len) имеет смысл.

Эти ABC s используются, чтобы проверить, соответствуют ли определенные объекты в Python указанному интерфейсу. Вместо создания пользовательского MappingView вы можете просто register любых новых классов, которые соответствуют ему.

Достаточно сказать, что вы не были бы register класс для MappingView, так как он используется исключительно в качестве базового класса для обеспечения по умолчанию __len__, __repr__ и __init__ к Keys/Values/Items взглядов. Если вы определили новый тип сопоставления, который возвращает пользовательские представления, просто зарегистрируйте эти представления в соответствующих Keys/Values/Items представлениях.

Смежные вопросы