1
私はしかし、カスタム動作とisinstance()
を呼び出すときに、int
から継承exemple posint
クラスを持っているしたいと思います:isinstanceのカスタム動作を使って新しいタイプを正しく作成する方法は?
>>> isinstance(1, int), isinstance(1, posint)
(True, True)
>>> isinstance(-1, int), isinstance(-1, posint)
(True, False)
私が最初に試さ:
class posint(int):
def __instancecheck__(self, obj):
try:
obj >= 0
return True
except:
return False
しかし__instancecheck__
をする必要がメタクラスで宣言した。
は、だから私は、この重く、醜いもので終わる:
class NewType(type):
def __instancecheck__(self, obj):
try:
obj >= 0
return True
except:
return False
class posint(metaclass=NewType):
pass
それは動作しますが、それは良い解決策になることができない...は、継承をサポートしていない、他の検査では動作しません。 ..
その後、私はもっと良いものを実装するために管理:
class CheckedType(type):
def __instancecheck__(cls, obj):
if not all(isinstance(obj, base) for base in cls.mro()[1:-1]):
return False
return cls.__instancecheck__(obj)
class posint(int, metaclass=CheckedType):
@classmethod
def __instancecheck__(cls, obj):
if obj >= 0:
return True
return False
をしかし、これは__instancecheck__
の乱用です。 私はabc
またはtyping
モジュールから何かを使用することができると考えていた...
アイデア?
このクラスは、実際には 'int'のサブクラスである必要はありません。 – user2357112
'int'のすべてのメソッドを継承したいのであれば、... –
これが問題です。 'int'から継承するメソッドは、このクラスの具体的なインスタンスを作成する場合にのみ重要です。そうするつもりなら、あなたのクラスは責任を混同してはいけません。一方では、あなたのクラスは 'isinstance(5、posint)'を使って、正のintnessをチェックする方法として動作するはずです。一方、あなたのクラスの具体的なインスタンスは、 'posint(5)-posint(6)'を禁止する通常の正の 'int'とは異なる振る舞いをするでしょう、あるいはそれらが同じように振る舞うならば、 。 – user2357112