Я пытаюсь создать подкласс типа
, чтобы создать класс, позволяющий создавать специализированные типы. например, 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
?