如何在实例列表上调用特定方法(使用map)?

时间:2012-03-28 21:49:52

标签: python dictionary map method-call

我有以下课程:

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)

EEH?你如何在这里调用getName方法?这样可能吗?

6 个答案:

答案 0 :(得分:4)

不要使用map。改为使用生成器表达式:

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

或者,您可以简单地为__repr__类定义自己的Enum方法,如果您只是尝试打印该类,Python就会使用它来确定您打印的内容。

class Enum(RootFrament):

    # ...

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

答案 1 :(得分:3)

如果您为__repr__课程提供Enum方法,那么它会打印您想要的任何内容,而不是<Enum instance at 0x0998F080>

答案 2 :(得分:1)

您正在元组上调用该方法。如果你使用collidingEnums.itervalues,你将拥有一个Enum对象的生成器。

答案 3 :(得分:1)

我认为比使用“getName”更好的方法是在Enum类上使用 repr str unicode 函数。

可能是这样的

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

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

答案 4 :(得分:1)

由于在字典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()))

答案 5 :(得分:1)

可以<{1}}使用map 执行此操作

attrgetter

但是,由于您将地图的结果传递给连接,在这种情况下,最好使用带有from operator import attrgetter print ", ".join(map(attrgetter("getName"), collidingEnums.values())) 的生成器表达式作为Amber建议