使用__repr __()访问类变量

时间:2014-06-08 19:43:40

标签: 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)>
>>> print bar[1]
4

我知道__repr__()__str__(),但如果我尝试通过&#34; []&#34;来访问号码,则会出现以下错误:

AttributeError: Foo instance has no attribute '__getitem__'

我知道有可能以某种方式,例如pygame库有一个名为Rect的对象,它完全按照上面的方式工作。

谢谢!

3 个答案:

答案 0 :(得分:1)

这里有两个完全不同的问题。如果您将值设置为self.a,则需要将其作为self.a访问,而不是使用[]。让你的__str__做类似的事情:

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

如果您希望能够使用[]访问这些变量,则需要按照Stefano Sanfilippo的回答和the documentation中的说明定义__getitem__

答案 1 :(得分: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 ...

答案 2 :(得分: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]
相关问题