web-dev-qa-db-ja.com

intをPython

組み込みのint型をPython(v。2.5を使用しています)でサブクラス化することに興味がありますが、初期化を機能させるのに問題があります。

ここにいくつかのサンプルコードがありますが、これはかなり明白なはずです。

class TestClass(int):
    def __init__(self):
        int.__init__(self, 5)

ただし、これを使用しようとすると、次のようになります。

>>> a = TestClass()
>>> a
0

結果は5になると思います。

私は何が間違っているのですか?これまでのところ、Googleはあまり役に立ちませんでしたが、何を検索すればよいのかよくわかりません。

48
me_and

intは不変であるため、作成後に変更することはできません。代わりに__new__を使用してください。

class TestClass(int):
    def __new__(cls, *args, **kwargs):
        return  super(TestClass, cls).__new__(cls, 5)

print TestClass()
62
Anurag Uniyal

正解ですが、現在の回答は完全ではない可能性があります。

例えば.

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構文に変更されました。

8
Jason Morgan