6

Pythonリストをエミュレートするクラスを使用しています。インデックスなしでアクセスしたときに、Pythonのlist()として返したいです。

通常のlist()で:

>>> a = [1,2,3]
>>> a
[1,2,3]

私が得ているもの、本質的に:

>>> a = MyList([1,2,3])
>>> a
<0xdeadbeefのMyListオブジェクト>

どのdunderメソッド(ある場合)でこの動作をカスタマイズできるかわかりませんか?

__ get __になると思いますか?list()はget / set / deleteを実装していませんが、組み込みであるためだと思いますか?

4

4 に答える 4

5

あなたが探している方法はそうです__repr__。http://docs.python.org/reference/datamodel.html#objectも参照してくださいrepr

于 2012-09-30T22:21:42.020 に答える
4

__repr__クラス内のメソッド(およびオプションでメソッドも)をオーバーライドする必要があります。違いについては、__str__この投稿を参照してください。

このようなもの:

class MyList(object):
    def __repr__(self):
        # iterate over elements and add each one to resulting string

コメントで指摘されているように、定義されていない場合は呼び出しますが、定義されていstr()ない場合は呼び出しません。__repr____str__repr()__str____repr__

于 2012-09-30T22:16:43.653 に答える
3

非常に簡単な例:

class MyList(object):
    def __init__(self,arg):
       self.mylist = arg
    def __repr__(self):
        return 'MyList(' + str(self.mylist) + ')'
    def __str__(self):
        return str(self.mylist)
    def __getitem__(self,i):
        return self.mylist[i]

a = MyList([1,2,3])
print a
print repr(a)
for x in a:
    print x

出力:

[1, 2, 3]
MyList([1, 2, 3])
1
2
3
于 2012-09-30T22:27:55.880 に答える
0

私自身の質問に答えさせてください-私が探しているのは__repr__メソッドだと思います。私が間違っている場合は私を訂正してください。これが私が思いついたものです:

def __repr__(self):
    return str([i for i in iter(self)])
于 2012-09-30T22:22:59.297 に答える