組み込みのint
型をPython(v。2.5を使用しています)でサブクラス化することに興味がありますが、初期化を機能させるのに問題があります。
ここにいくつかのサンプルコードがありますが、これはかなり明白なはずです。
class TestClass(int):
def __init__(self):
int.__init__(self, 5)
ただし、これを使用しようとすると、次のようになります。
>>> a = TestClass()
>>> a
0
結果は5
になると思います。
私は何が間違っているのですか?これまでのところ、Googleはあまり役に立ちませんでしたが、何を検索すればよいのかよくわかりません。
int
は不変であるため、作成後に変更することはできません。代わりに__new__
を使用してください。
class TestClass(int):
def __new__(cls, *args, **kwargs):
return super(TestClass, cls).__new__(cls, 5)
print TestClass()
正解ですが、現在の回答は完全ではない可能性があります。
例えば.
a = TestClass()
b = a - 5
print type(b)
Bを整数として表示します。ここで、bをTestClassにすることができます。
ここに改善された答えがあります
class positive(int):
def __new__(cls, value, *args, **kwargs):
if value < 0:
raise ValueError("positive types must not be less than zero")
return super(cls, cls).__new__(cls, value)
def __add__(self, other):
res = super(positive, self).__add__(other)
return self.__class__(max(res, 0))
def __sub__(self, other):
res = super(positive, self).__sub__(other)
return self.__class__(max(res, 0))
def __mul__(self, other):
res = super(positive, self).__mul__(other)
return self.__class__(max(res, 0))
def __div__(self, other):
res = super(positive, self).__div__(other)
return self.__class__(max(res, 0))
def __str__(self):
return ("%d" % int(self))
def __repr__(self):
return ("positive(%d)" % int(self))
今、同じ種類のテスト
>>> a = positive(10)
>>> b = a - 9
>>> print(type(b))
<class '__main__.positive'>
更新:
reprおよびstrの例を追加して、新しいクラスがそれ自体を正しく出力するようにしました。また、関連性を維持するためにOPがPython 2を使用していても、Python 3構文に変更されました。