Python 使用_repr__;()访问类变量

Python 使用_repr__;()访问类变量,python,class,repr,Python,Class,Repr,我对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)> >

我对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
我知道这在某种程度上是可能的,例如
pygame
库有一个名为
Rect
的对象,它的工作方式与上面的方式完全相同


谢谢

这里有两个完全不同的问题。如果将值设置为
self.a
,则需要以
self.a
的身份访问该值,而不是使用
[]
。只需让您的
\uuuu str\uuuu
执行以下操作:

return '<foo({0}, {1}, {2})>'.format(self.a, self.b, self.c)
返回“”。格式(self.a、self.b、self.c)

如果您希望能够使用
[]
访问这些变量,那么您需要按照Stefano Sanfilippo的回答和中所述定义
\uuuu getitem\uuuu

正如
AttributeError
所述,您需要为您的类定义一个
\uu getitem\uuu
方法:

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

不过,在这种情况下,我会考虑使用<代码>清单>代码>……/p> < p>不确定这是否正是你想要的。将值设置为self.a将通过

print bar.a
访问。不过,稍微变通一下,当您设置所有的self值时,就会形成一个字典。可以通过从所有自属性中提取值来获取数组

>>> bar = Foo()
>>> print bar
<foo(3, 4, 5)>
>>> bar.__dict__
{'a': 3, 'b': 4, 'c': 5}
>>> bar.__dict__.values()
[3,4,5]
>bar=Foo()
>>>打印条
>>>酒吧__
{'a':3,'b':4,'c':5}
>>>条.____;dict.values()
[3,4,5]

\uuuuu插槽\uuuuu
放入类中或从列表继承/tuple@yedpodtrzitko:给类指定
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?那你有什么建议?什么编辑?你说“丑”是指埃利夫街吗?谢谢你的帮助。是的,正是
elif
块。我重复一下,如果不需要三个变量(第二个片段),请考虑使用一个列表。欢迎:)返回[self.a,self.b,self.c][index]
怎么样?是的@SvenMarnach,这很好,尽管它会为每次调用
\uuu getitem\uuuuuu
重新生成列表。如果频繁使用索引,可能会出现性能问题。
class Foo:
    def __init__(self):
        self.elements = [3, 4, 5]

    def __getitem__(self, index):
        return self.elements[index]
>>> bar = Foo()
>>> print bar
<foo(3, 4, 5)>
>>> bar.__dict__
{'a': 3, 'b': 4, 'c': 5}
>>> bar.__dict__.values()
[3,4,5]