如果对象的属性可以是列表还是单个值,应该如何访问它?

时间:2017-04-25 17:25:54

标签: python list types attributes

我有一个Event对象,它可以有许多属性,其中一些是单值,其中一些是值列表。

class Event(object):
    pass

event = Object()
event.b = [10, 20, 30]
event.c = 15

我试图访问所有属性,这样我最终得到了很多单值,有点像这样:

print(Variable(event = event, name = "b[0]")
print(Variable(event = event, name = "b[1]")
print(Variable(event = event, name = "b[2]")
print(Variable(event = event, name = "c"   )

为了做到这一点,我创建了一个Variable类:

class Variable(object):

    def __init__(
        self,
        name  = None,
        value = None,
        event = None,
        ):

        self._name  = name
        self._value = value
        self._event = event

        if self._value is None:
            # add magic here
            self._value = getattr(self._event, self._name)

    def name(
        self
        ):

        return self._name

    def value(
        self
        ):

        return self._value

我希望这个变量类能够理解指定名称末尾的“[2]”意味着该属性是一个列表,并且应该访问其索引2的元素并将其设置为变量实例的单一价值。什么是一个好方法呢?

请注意,这是我正在做的简化版本 - 实际上我正在处理数百万个事件和数千个属性,我正在尝试最小化我必须编写的代码量(并随后更改)通过使变量类智能化。

1 个答案:

答案 0 :(得分:1)

我不知道一种优雅的方法,但你可以使用这样一个事实,即普通变量不应该有括号来分隔索引,然后编写一个基本上包裹{{1}的函数检查括号:

getattr

这并非真正意味着处理极端名称案例或错误,但它有望让您走上正确的轨道。