2012-03-28 21 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()作爲琥珀建議

相關問題