2012-03-28 13 views
1

私は以下のクラスを持っている:(マップを使用して)インスタンスのリストで特定のメソッドをどのように呼び出すのですか?

class Enum(RootFragment): 

    def __init__(self, column, packageName, name, modifiers=["public"], enumValues=[]): 
     RootFragment.__init__(self, packageName, name, modifiers, "enum") 

     self.column = column 
     self.enumValues = [] 

     map(self.addEnumValue, enumValues) 

    ... more methods 

今、私は辞書に入れている列挙型インスタンスの数を作成します。これはに印刷する内容である:

{'ManagerRole': <Enum instance at 0x0998F080>, 'StaffMemberRole': <Enum instance at 0x0998B490>} 

<Enum instance at 0x0998F080>が、私は、各インスタンスにgetNameメソッドを呼び出したいのですが非常に便利ではありませんので。

print ", ".join(map(Enum.getName, collidingEnums.items())), 

をが、これは言って私にエラーを与えた:私はしようとしていた

TypeError: unbound method getName() must be called with Enum instance as first argument (got tuple instance instead) 

ええ?ここでgetNameメソッドとはどのように呼びますか?そんなことは可能でしょうか?あなたEnumクラスの__repr__方法を指定した場合

+0

を使用すると、getattrが使用されます。例えば、 –

+0

は、 'getattr(object、" __name __ ")'を使用することを意味します。 –

+3

この特定の場合の問題は 'dict.items()'を呼び出して、 '(key、value)'タプル。 'dict.values()'を呼び出すと、この例はうまくいきます。ただし、すべてが同じタイプではない値に対しても機能するようにするには、アンバーの提案でリスト内包を使用します。 –

答えて

4

するのではなく、好きなことを出力します。代わりにジェネレータ式を使用する:あなただけのクラスを印刷しようとする代わりに

print ", ".join(i.getName() for i in collidingEnums.values()) 

、あなたは単にPythonはあなたがプリントアウトかを決定するために使用するものであるあなたのEnumクラス用に独自の__repr__メソッドを定義することができます。

class Enum(RootFrament): 

    # ... 

    def __repr__(self): 
     return self.getName() 
+0

'collidingEnums.items()のiのi.getName()は、AttributeError: 'tuple'オブジェクトに属性 'getName'がないことを示します... ...これをcollidingEnumsのi.getName()キーに変更しました。 items() 'はうまく動作しているようです – Kawu

+0

申し訳ありません、ええ、' .values() ' – Amber

+0

どんな理由であれ、' __repr__'は何かについて学ぶのが最も面白かったです。以前は見たことがありません。 Pythonでこれを行う方法は数多くあります。すばらしい言葉です。ありがとうございます。 – Kawu

3

、それはあなたがmapを使用しないでください<Enum instance at 0x0998F080>

1

タプルでメソッドを呼び出しています。 collidingEnums.itervaluesを使用すると、Enumオブジェクトのジェネレータが生成されます。

1

私は「のgetName」を使用してより良い方法は、列挙型クラスにのreprSTRまたはユニコード機能を使用することだと思います。

それは辞書itemsリターンのペアであるため、この

class Enum(): 
    def getName(self): 
     return self.name 

    def __repr__(self): 
     return self.getName() 
+0

コード生成に '__str__'が必要でした。私は前に '__repr__'を知らなかった。ニース。 – Kawu

1

(key, value)そのペアにEnum.getNameを呼び出す方法がないようなものになることができます。値の代わりに呼び出します(例:

print ", ".join(map(Enum.getName, collidingEnums.values()) 

キーを表示する場合は、あなたattrgetter

from operator import attrgetter 
print ", ".join(map(attrgetter("getName"), collidingEnums.values())) 

を使用してmapでこれをを行うことができます。しかし、あなたが参加にマップの結果を渡しているので、この中に良いだろう、両方の部品

print ", ".join(map(lambda x: x[0] +":"+ x[1].getName(), collidingEnums.items())) 
1

上で動作するlambdaアンプがjoin()のジェネレータ式を使用する場合は、アンバーとして

関連する問題