我有一個有一些屬性的類。我想保存這個類的一個實例的屬性列表,像這樣:如何存儲屬性列表(而不是它們的值)?
obj = MyClass()
prop_list = [ obj.prop1, obj.prop2, obj.prop3, obj.prop1, obj.prop3 ]
以這樣的方式,
prop_list[0] = something
將用相同的語法調用屬性setter(不一定
課程)。這可能以某種方式嗎?
我有一個有一些屬性的類。我想保存這個類的一個實例的屬性列表,像這樣:如何存儲屬性列表(而不是它們的值)?
obj = MyClass()
prop_list = [ obj.prop1, obj.prop2, obj.prop3, obj.prop1, obj.prop3 ]
以這樣的方式,
prop_list[0] = something
將用相同的語法調用屬性setter(不一定
課程)。這可能以某種方式嗎?
商店,而不是屬性的名稱,並使用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
你可以做:
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'
二傳手怎麼樣? –
感謝您的反饋,我認爲它現在可以滿足您的需求... –
在倒數第二行,你忘了將一個前導'obj'參數傳遞給'CustomPropertyList()'。另外,如果你想將定義'def __init __(self,obj,names):'改成'def __init __(self,obj,* names):'當調用這個屬性名時不需要顯式地創建一個屬性名列表構造函數,即'CustomPropertyList(obj,「prop1」,「prop2」,「prop3」,「prop1」,「prop3」)'會起作用。 – martineau
啊,我的不好。謝謝,修復。 –