3

我可能正在接近这个错误,但希望能被理顺。

我希望能够同时使用类的某些属性的值和名称

样本:

class DoStuff(object):
    def __init__(self):
        self.a="Alpha"
        self.b="Beta"
        self.c="Gamma"
    def printStuff(self):
        for thing in [self.a, self.b, self.c]:
            print NAMEOFTHING, thing

我想要的是:

a Alpha
b Beta
c Gamma

我怎么能得到那个?

编辑:有些混乱,因为我的示例显示我打印所有值。相反,我想要这个:

a Alpha
c Gamma

我的打印方法的列表中只有“a”和“c”。

4

4 回答 4

8

您的类和for循环的设置方式,没有什么可以代替您NAMEOFTHING获取这些变量的名称。以下是一些关于如何修改方法的替代方法:

  • 使用字典而不是单个属性,然后在for循环中提供键列表:

    class DoStuff(object):
        def __init__(self):
            self.names = {"a": "Alpha",
                          "b": "Beta",
                          "c": "Gamma"}
        def printStuff(self):
            for name in ['a', 'b', 'c']:
                print name, self.names[name]
    
  • 使用列表中的属性名称,然后使用getattr()

    class DoStuff(object):
        def __init__(self):
            self.a="Alpha"
            self.b="Beta"
            self.c="Gamma"
        def printStuff(self):
            for name in ['a', 'b', 'c']:
                print name, getattr(self, name)
    
于 2012-12-20T18:17:24.323 回答
5

你能得到的最接近的是:

for thing in ['a', 'b', 'c']:
    print thing, getattr(self, thing)

变量可以有多个名称并且不知道它们自己的名称,因此如果您知道它是“a”,那么您可以使用它getattr来解析查找。

另一种选择(虽然与上面没有太大不同)

to_get = ['a', 'b', 'c']
from operator import attrgetter
blah = zip(to_get, attrgetter(*to_get)(self))
于 2012-12-20T18:13:56.960 回答
1

按照 Jon 的回答,您可能还会发现将要包含在输出中的属性列表设置为可选参数很有帮助:

def printStuff(self, included=['a', 'c']):
    for thing in included:
        print thing, getattr(self, thing)

这可以很容易地生成两个输出,DoStuff().printStuff()只需获取 和 的值ac或者DoStuff().printStuff(['a', 'b', 'c'])获取所有三个值。当然,这允许不同的输出——如果明确的设计目标是打印的字段集是不变的,那么这将适得其反。

于 2012-12-20T18:54:37.433 回答
0
# You can use __dict__
>>> class x:
>>>     def __init__(self):
>>>         self.a = 1
>>>         self.b = 2
>>>         self.c = 3
>>>         self.d = 4

>>>     def prnt(self):
>>>         limit = "b", "c"
>>>         return {k:v for (k, v) in self.__dict__.iteritems()if k in limit}

>>> r = x()
>>> print r.prnt()
    {'b': 2, 'c': 3}

# __dict__ can be also done outside the class

limit = "b", "c"
print {k:v for (k, v) in r.__dict__.iteritems()if k in limit}
于 2012-12-20T18:21:56.890 回答