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__()and __str__(),但是如果我尝试通过“[]”访问数字,则会出现以下错误:

AttributeError: Foo instance has no attribute '__getitem__'

我知道这是有可能的,例如pygame库有一个名为的对象Rect,它的工作方式与上述方式完全相同。

谢谢!

4

3 回答 3

1

您在这里有两个完全不同的问题。如果将值设置为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

如前所述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

如果你不需要a,bc是单独的变量,你可以使用:

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 回答
0

不确定这是否正是您想要的。将值设置为 self.a 将使用print bar.a. 但是,轻微的解决方法是,当您设置所有 self 值时,会形成一个字典。您可以通过从所有 self 属性中提取值来获取数组。

>>> 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 回答