2013-06-19 32 views
5

Tôi có một lớp học với một số thuộc tính. Tôi muốn để lưu trữ một danh sách các thuộc tính của một thể hiện của lớp này như sau:Làm cách nào để lưu trữ danh sách thuộc tính (không phải giá trị của chúng)?

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

trong cách mà

prop_list[0] = something 

sẽ gọi setter tài sản (không nhất thiết phải có cú pháp tương tự khóa học). Điều này có thể bằng cách nào đó?

Trả lời

3

Store tên các thuộc tính để thay thế và sử dụng setattr:

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

Nếu bạn thực sự cần cú pháp phân mục, điều này cũng có thể với một lớp tùy chỉnh:

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

Trong lần thứ hai để dòng cuối cùng , bạn quên chuyển đối số 'obj' hàng đầu cho' CustomPropertyList() '. Ngoài ra, nếu bạn thay đổi định nghĩa 'def __init __ (self, obj, names):' thành 'def __init __ (self, obj, * names):' sẽ không cần thiết để tạo một danh sách các tên thuộc tính một cách rõ ràng khi gọi constructor, tức là 'CustomPropertyList (obj," prop1 "," prop2 "," prop3 "," prop1 "," prop3 ")' sẽ hoạt động. – martineau

+0

Ah, tệ lắm. Cảm ơn, cố định. –

1

bạn có thể làm :

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

sau đó sử dụng nó như:

getter[0]() 

mà sẽ trả về giá trị của obj.prop1 ...

tương tự bạn có thể sử dụng setter để thiết lập thuộc tính mới:

setter[1]('test') 

sẽ tạo obj.prop2='test'

+0

Điều gì về setter? –

+0

cảm ơn bạn đã phản hồi, tôi nghĩ rằng nó có thể đáp ứng nhu cầu của bạn ngay bây giờ ... –

Các vấn đề liên quan