Python的简写,用于表示一组类属性的元组

时间:2014-06-25 15:17:02

标签: python class tuples class-attributes

假设我正在使用某个python包中的类,如下所示

class foo(object):
    def __init__(self):
        self.a = None
        self.b = None
        self.c = None
        self.d = None
        self.e = None
        self.f = None

现在我需要在某些操作中使用类foo的对象foobar的属性bde,例如调用函数qux:

print qux(foobar.b, foobar.d, foobar.e)

有没有办法创建这个的简写版本,如下面的想象代码:

print qux(*foobar.[b,d,e])

注意约束:类和函数都不能改变。

2 个答案:

答案 0 :(得分:3)

好吧,getattrsetattr让你接近:

setattr分配(下一个工作不需要,只是为了说明):

class foo(object):
    def __init__(self):
        for name in 'abcdef':
            setattr(self, name, None)

使用getattr的值:

print qux(*(getattr(foobar, name) for name in 'bde'))

使用正常的,更长的名称,您需要改为in ['foo', 'bar']

答案 1 :(得分:1)

由于你无法修改类,如何获取一个实例和任意数量的属性名称的函数,并返回一个元组:

class Foo(object):
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 3


def getitems(obj, *items):
    values = []

    for item in items:
        values.append(getattr(obj, item))

    return tuple(values)

f = Foo()
print getitems(f, 'a', 'c')  # prints (1, 3)
qux(*getitems(f, 'a', 'c'))

如果您愿意修改该类,则可以覆盖__getitem__以接受一组键。

class Foo(object):
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 3

    def __getitem__(self, item):
        if isinstance(item, basestring):
            # treat single key as list of length one
            item = [item]

        values = []

        for key in item:
            # iterate through all keys in item
            values.append(getattr(self, key))

        return tuple(values)

f = Foo()
print f['a', 'c']  # prints (1, 3)
qux(*f['a', 'c'])