type
特殊な型を作成できるクラスを作成するために、サブクラス化しようとしています。例ListType
:
>>> ListOfInt = ListType(list, value_type=int)
>>> issubclass(ListOfInt, list)
True
>>> issubclass(list, ListOfInt)
False
>>> # And so on ...
ただし、これListOfInt
がインスタンスの作成に使用されることはありません。他のタイプと比較するために操作できるインスタンスとして使用するだけtype
です...特に、私の場合、入力のタイプに応じて適切な操作を検索する必要があり、次のタイプが必要です。より多くの精度が含まれています(list of int
またはXML 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
か?