2013-06-19 65 views
5

我有一個有一些屬性的類。我想保存這個類的一個實例的屬性列表,像這樣:如何存儲屬性列表(而不是它們的值)?

obj = MyClass() 
prop_list = [ obj.prop1, obj.prop2, obj.prop3, obj.prop1, obj.prop3 ] 
以這樣的方式,

prop_list[0] = something 

將用相同的語法調用屬性setter(不一定

課程)。這可能以某種方式嗎?

回答

3

商店,而不是屬性的名稱,並使用setattr

obj = MyClass() 
prop_list = [ "prop1", "prop2", "prop3", "prop1", "prop3" ] 
setattr(obj, prop_list[0], something) 

如果你真的需要的項目分配的語法,這也是可能的自定義類:

class CustomPropertyList(object): 
    def __init__(self, obj, names): 
     self.obj = obj 
     self.property_names = list(names) 

    def __getitem__(self, item): 
     return getattr(self.obj, self.property_names[item]) 

    def __setitem__(self, item, value): 
     setattr(self.obj, self.property_names[item], value) 

prop_list = CustomPropertyList(obj, ["prop1", "prop2", "prop3", "prop1", "prop3"]) 
prop_list[0] = something 
+1

在倒數第二行,你忘了將一個前導'obj'參數傳遞給'CustomPropertyList()'。另外,如果你想將定義'def __init __(self,obj,names):'改成'def __init __(self,obj,* names):'當調用這個屬性名時不需要顯式地創建一個屬性名列表構造函數,即'CustomPropertyList(obj,「prop1」,「prop2」,「prop3」,「prop1」,「prop3」)'會起作用。 – martineau

+0

啊,我的不好。謝謝,修復。 –

1

你可以做:

getter = [ lambda x=x: getattr(obj, x) for x in ['prop1', 'prop2', 'prop3'] ] 
setter = [ lambda v, x=x: setattr(obj, x, v) for x in ['prop1', 'prop2', 'prop3'] ] 

然後像這樣使用它:

getter[0]() 

,將返回的obj.prop1值...

同樣可以使用setter設置新的屬性:

setter[1]('test') 

將創建obj.prop2='test'

+0

二傳手怎麼樣? –

+0

感謝您的反饋,我認爲它現在可以滿足您的需求... –

相關問題