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)

これにより、との値だけを取得するか、3つすべてを取得すると言うことで、両方の出力を簡単に生成できます。もちろん、これにより出力を変えることができます。印刷されるフィールドのセットが不変であることが明示的な設計目標である場合、これは逆効果になります。DoStuff().printStuff()acDoStuff().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 に答える