我正在尝试子类化type
以创建一个允许构建专用类型的类。例如ListType
:
>>> ListOfInt = ListType(list, value_type=int)
>>> issubclass(ListOfInt, list)
True
>>> issubclass(list, ListOfInt)
False
>>> # And so on ...
但是,这ListOfInt
永远不会用于创建实例!我只是将它用作type
我可以操纵以与其他类型进行比较的实例......特别是,在我的情况下,我需要根据输入的类型查找合适的操作,并且我需要类型包含更多的精度(如list of int
orXML string
等...)。
所以这就是我想出的:
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
,Python 吓坏了:
>>> isinstance(t, SpzType)
TypeError: __subclasscheck__() takes exactly one argument (0 given)
我探索了发生了pdb.pm()
什么,我发现以下代码引发了错误:
>>> SpzType.__subclasscheck__(SimpleType)
TypeError: __subclasscheck__() takes exactly one argument (0 given)
奇怪的 ?!显然有一个论点......那是什么意思?任何的想法 ?我误用了abc
吗?