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

现在我创建了一些 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这里的方法?有可能吗?

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

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

于 2012-03-28T21:58:58.933 回答
1

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

它可以是这样的

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

可以map使用_attrgetter

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

但是由于您将映射的结果传递给连接,因此在这种情况下,最好使用生成器表达式,join()如 Amber 建议的那样

于 2012-03-28T22:06:20.597 回答