2013-06-19 15 views
5

Mam klasę z niektórymi właściwościami. Chciałbym przechowywać listę właściwości instancji tej klasy tak:Jak mogę zapisać listę właściwości (nie ich wartości)?

obj = MyClass() 
prop_list = [ obj.prop1, obj.prop2, obj.prop3, obj.prop1, obj.prop3 ] 

w taki sposób, że

prop_list[0] = something 

byłoby powołać ustawiająca właściwość (niekoniecznie z tej samej składni kierunek). Czy to w jakiś sposób jest możliwe?

Odpowiedz

3

Przechowywać nazwy właściwości i zamiast używać setattr:

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

Jeśli naprawdę potrzebujesz składni przypisania pozycji, jest to również możliwe z klasy niestandardowe:

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

W przedostatniej linii , zapomniałeś przekazać wiodący argument "obj" do 'CustomPropertyList()'. Ponadto, jeśli chciałbyś zmienić definicję 'def __init __ (self, obj, names):' na 'def __init __ (self, obj, * names):' byłoby niepotrzebne jawne utworzenie listy nazw właściwości podczas wywoływania konstruktor, np. 'CustomPropertyList (obj," prop1 "," prop2 "," prop3 "," prop1 "," prop3 ")' zadziała. – martineau

+0

Ach, moja zła. Dzięki, naprawione. –

1

można zrobić :

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'] ] 

następnie używać go jak:

getter[0]() 

że zwróci wartość obj.prop1 ...

podobnie można użyć setter ustawić nowe właściwości:

setter[1]('test') 

stworzy obj.prop2='test'

+0

co z seter? –

+0

dziękuję za opinię, myślę, że może teraz spełnić twoje potrzeby ... –

Powiązane problemy