假设我正在使用某个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的属性b
,d
和e
,例如调用函数qux:
print qux(foobar.b, foobar.d, foobar.e)
有没有办法创建这个的简写版本,如下面的想象代码:
print qux(*foobar.[b,d,e])
注意约束:类和函数都不能改变。
答案 0 :(得分:3)
好吧,getattr
和setattr
让你接近:
与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'])