2012-03-28 23 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) 

EEH?你如何在这里打电话给getName?这有可能吗?

+0

使用'getattr'。例如 – 2012-03-28 21:56:01

+0

对不起,我的意思是,使用'getattr(object,“__name __”)' – 2012-03-28 21:57:59

+3

你在这种特殊情况下的问题是你调用'dict.items()',它返回'(key,value)'元组。如果你正在调用'dict.values()'这个特定的例子会起作用。但是,要使它适用于并非都具有相同类型的值,请使用Amber建议中的列表理解。 – 2012-03-28 21:59:48

回答

4

而是不要使用map。用生成器表达式来代替:

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

或者,你可以简单地定义自己的__repr__方法为您Enum类,这是什么Python使用,以确定您打印的内容,如果你只是尝试打印类。

class Enum(RootFrament): 

    # ... 

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

'i.getName()for i in collidingEnums.items()'给出“AttributeError:'元组'对象没有属性'getName'”...将其改变为i.getName()的key,i in collidingEnums。 items()'似乎可以工作 – Kawu 2012-03-28 22:02:37

+0

对不起,是的,它会是'.values()' – Amber 2012-03-28 22:03:48

+0

无论出于什么原因'__repr__'是最有趣的东西。从未见过它。 Python中有很多方法可以完成它,令人惊叹的语言。谢谢大家。 – Kawu 2012-03-28 22:11:21

3

如果提供了__repr__方法为你Enum类,那么它会打印任何你想要的<Enum instance at 0x0998F080>

1

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

1

我觉得比用“的getName”一个更好的方法是使用再版STR统一的枚举类功能。

它可以是这样的

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

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

我需要'__str__'来生成代码。我以前不知道'__repr__'。尼斯。 – Kawu 2012-03-28 22:13:17

1

因为在字典items回报对(key, value)有没有方法来调用Enum.getName上对。只需在数值上调用它,例如

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

如果你想显示的关键,也是如此,例如使用一个lambda使用attrgetter

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

两个部分工作

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

可以做到这一点与map但因为你是路过地图的结果为加入,这将是这更好case使用发生器表达式join()作为琥珀建议

相关问题