Python: подкласс `type` для создания специализированных типов (например,« список int »)

Я пытаюсь создать подкласс типа , чтобы создать класс, позволяющий создавать специализированные типы. например, ListType :

>>> ListOfInt = ListType(list, value_type=int)
>>> issubclass(ListOfInt, list)
True
>>> issubclass(list, ListOfInt)
False
>>> # And so on ...

Однако, этот ListOfInt никогда не будет использоваться для создания экземпляров! Я просто использую его как экземпляр типа , которым я могу управлять для сравнения с другими типами ... В частности, в моем случае я нужно найти подходящую операцию в соответствии с типом ввода, и мне нужно, чтобы тип содержал больше точности (например, список int или строка XML и т. д. .).

Итак, вот что я придумал:

class SpzType(type):

    __metaclass__ = abc.ABCMeta

    @classmethod
    def __subclasshook__(cls, C):
        return NotImplemented

    def __new__(cls, base, **features):
        name = 'SpzOf%s' % base.__name__
        bases = (base,)
        attrs = {}
        return super(SpzType, cls).__new__(cls, name, bases, attrs)

    def __init__(self, base, **features):
        for name, value in features.items():
            setattr(self, name, value)

Использование abc не очевидно в приведенном выше коде ... однако, если я хочу написать подкласс ListType , как в примере сверху, тогда это становится полезным ...

Базовая функциональность действительно работает:

>>> class SimpleType(SpzType): pass
>>> t = SimpleType(int)
>>> issubclass(t, int)
True
>>> issubclass(int, t)
False

Но когда я пытаюсь проверить, является ли t экземпляром SpzType , Py thon freaks out:

>>> isinstance(t, SpzType)
TypeError: __subclasscheck__() takes exactly one argument (0 given)

Я исследовал с pdb.pm () , что происходит, и обнаружил, что следующий код вызывает ошибку:

>>> SpzType.__subclasscheck__(SimpleType)
TypeError: __subclasscheck__() takes exactly one argument (0 given)

WeIrD?! Очевидно, есть аргумент ... Так что это значит? Есть идеи ? Я неправильно использовал abc ?

7
задан sebpiq 15 June 2011 в 18:57
поделиться