0

私はPythonに比較的慣れていないので、印刷するとタプルを返すようにクラスを「構成」する方法を知りたいと思っていました。

例: 属性 a、b & c を持つクラスがあります。

class Foo:
    def __init__(self):
        self.a = 3
        self.b = 4
        self.c = 5

次の方法でこれらの属性にアクセスできるようにクラスを「構成」するにはどうすればよいですか。

>>> bar = Foo()
>>> print bar
<foo(3, 4, 5)>
>>> print bar[1]
4

と はわかっ__repr__()__str__()いますが、「[]」を介して番号にアクセスしようとすると、次のエラーが発生します。

AttributeError: Foo instance has no attribute '__getitem__'

たとえば、ライブラリには上記とまったく同じように機能pygameするというオブジェクトがあります。Rect

ありがとう!

4

3 に答える 3

1

ここには、まったく別の 2 つの質問があります。値を として設定した場合は、を使用せずself.aに としてアクセスする必要があります。次のようなことをしてください:self.a[]__str__

return '<foo({0}, {1}, {2})>'.format(self.a, self.b, self.c)

を使用してこれらの変数にアクセスできるようにする場合は、Stefano Sanfilippo の回答とドキュメント[]で説明されているように定義する必要があります。__getitem__

于 2014-06-08T19:47:25.993 に答える
0

これがまさにあなたが望むものかどうかはわかりません。値を self.a として設定すると、 でアクセスできますprint bar.a。ただし、わずかな回避策として、すべての自己値を設定すると、辞書が形成されます。すべての自己属性から値を取得することで、配列を取得できます。

>>> bar = Foo()
>>> print bar
<foo(3, 4, 5)>
>>> bar.__dict__
{'a': 3, 'b': 4, 'c': 5}
>>> bar.__dict__.values()
[3,4,5]
于 2014-06-08T19:57:31.267 に答える
0

が言うように、クラスのメソッドAttributeErrorを定義する必要があります。__getitem__

class Foo:
    def __init__(self):
        self.a = 3
        self.b = 4
        self.c = 5

    def __getitem__(self, index):
        if index == 0:
            return self.a
        elif index == 1:
            return self.b
        elif index == 2:
            return self.c
        else:
            raise KeyError("Index must be 0, 1 or 2")

醜いですが、動作します:

>>>bar = Foo()
>>>print bar
<__main__.Foo instance at xxxxxxxxxxxx>
>>>print bar[1]
4

を必要とせずabcの変数にする場合は、次を使用できます。

class Foo:
    def __init__(self):
        self.elements = [3, 4, 5]

    def __getitem__(self, index):
        return self.elements[index]

この場合、list直接使用することを検討します...

于 2014-06-08T19:47:32.210 に答える