Как вы вызываете конкретный метод в списке экземпляров (используя карту)? - PullRequest
1 голос
/ 29 марта 2012

У меня есть следующий класс:

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

Теперь я создаю несколько экземпляров Enum, которые помещаются в dict.Это то, что печатается на 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 здесь?Это вообще возможно?

Ответы [ 6 ]

4 голосов
/ 29 марта 2012

Не используйте map. Вместо этого используйте выражение генератора:

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

В качестве альтернативы, вы можете просто определить свой собственный метод __repr__ для вашего Enum класса, который Python использует для определения того, что вы печатаете, если вы просто пытаетесь напечатать класс.

class Enum(RootFrament):

    # ...

    def __repr__(self):
        return self.getName()
3 голосов
/ 29 марта 2012

Если вы предоставите метод __repr__ для класса Enum, он будет печатать все, что вы хотите вместо <Enum instance at 0x0998F080>

1 голос
/ 29 марта 2012

Вы можете сделать это с map, используя attrgetter

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

Но так как вы передаете результат карты в соединение, было бы лучше в этом случаеиспользовать выражение генератора с join(), как предложила Эмбер

1 голос
/ 29 марта 2012

Так как в словаре items возвращает пары (key, value), для этой пары нет метода для вызова Enum.getName .Вместо этого вызывайте его только для значения, например,

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

Если вы хотите, чтобы ключ отображался тоже, используйте, например, lambda для работы с обеими частями

print ", ".join(map(lambda x: x[0] +":"+ x[1].getName(), collidingEnums.items()))
1 голос
/ 29 марта 2012

Я думаю, что лучшим способом, чем использование getName, было бы использование repr , str или unicode функций класса Enum.

Это может быть что-то вроде этого

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

    def __repr__(self):
        return self.getName()
1 голос
/ 29 марта 2012

Вы вызываете метод для кортежа. Если вы используете collidingEnums.itervalues, у вас будет генератор объектов Enum.

...