【问题标题】:Access class variables with __repr__()使用 __repr__() 访问类变量
【发布时间】:2014-07-29 09:27:15
【问题描述】:

我对 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 的对象,它的工作方式与上述方式完全相同。

谢谢!

【问题讨论】:

  • __slots__放到你的类中或者从列表/元组继承它
  • @yedpodtrzitko:给你的班级__slots__ 对此没有影响,而从列表或元组继承还有其他通常不受欢迎的影响。

标签: python class repr


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    正如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...

    【讨论】:

    • 丑吗?那你有什么建议呢?
    • 什么编辑?当您说“丑陋”时,您是指 elif-row 吗?顺便感谢您的帮助。
    • 是的,正是elif 块。我再说一遍,如果您不需要三个单独的变量(第二个 sn-p),请考虑使用列表。欢迎你:)
    • return [self.a, self.b, self.c][index] 怎么样?
    • 是的@SvenMarnach,这很好,尽管它会为每次调用__getitem__ 重建列表。如果经常使用索引,可能会出现性能问题。
    【解决方案3】:

    不确定这是否正是您想要的。将值设置为 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]
    

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2017-11-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多