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

ここで、dict に入れる多数の Enum インスタンスを作成します。これは印刷されるものprint collidingEnumsです:

{'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ますか? まったくそのようにすることは可能ですか?

4

6 に答える 6

4

使用しないでくださいmap。代わりにジェネレータ式を使用してください。

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

__repr__または、クラスに独自のメソッドを定義することもできますEnum。これは、クラスを印刷しようとした場合に、Pythonが印刷内容を決定するために使用するものです。

class Enum(RootFrament):

    # ...

    def __repr__(self):
        return self.getName()
于 2012-03-28T21:57:15.300 に答える
3

クラスにメソッドを指定すると、代わりに必要なものが出力され__repr__ますEnum<Enum instance at 0x0998F080>

于 2012-03-28T21:56:34.323 に答える
1

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

于 2012-03-28T21:58:58.933 に答える
1

「getName」を使用するよりも良い方法は、 Enum クラスでreprstrまたはunicode関数を使用することだと思います。

それはこのようなものになることができます

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

    def __repr__(self):
        return self.getName()
于 2012-03-28T21:59:08.777 に答える
1

ディクショナリでitemsはペアが返されるため、そのペアで(key, value)呼び出すメソッドはありません。代わりに値でのみ呼び出します。Enum.getName

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

キーも表示したい場合は、たとえば alambdaを使用して両方の部分で作業します

print ", ".join(map(lambda x: x[0] +":"+ x[1].getName(), collidingEnums.items()))
于 2012-03-28T22:01:07.963 に答える
1

を使用してこれを行うことができますmapattrgetter

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

ただし、マップの結果を結合に渡しているため、この場合、join()Amber が提案したようにジェネレーター式を使用することをお勧めします。

于 2012-03-28T22:06:20.597 に答える