2010-03-11 35 views
16

Giả sử tôi tạo một thể hiện của một lớp và muốn gán một số giá trị cho các thuộc tính công khai của nó. Thông thường, điều này sẽ được thực hiện như thế này:Cách truy cập động các thuộc tính lớp trong Python?

class MyClass: 
    def __init__(self): 
     self.name = None 
     self.text = None 

myclass = MyClass() 
myclass.name = 'My name' 

Nhưng nếu một viết một chức năng mà phải mất một lớp như tham số và tôi muốn gán một số giá trị các tài sản công cộng của lớp đó tự động - đó là thông qua biến và vòng (. mà không biết có bao nhiêu có hoặc những gì họ được gọi là)

rõ ràng sẽ là:

myclass = MyClass() 
myclass['name'] = "My name" 

Nhưng điều đó không làm việc.

Bất kỳ ý tưởng nào?

+0

Ngoài ra, đây là bản sao: http://stackoverflow.com/questions/1167398/python-access-class-property-from-string –

Trả lời

31
setattr(my_class_instance, 'attr_name', attr_value) 
+4

Tài liệu có thể tìm thấy tại đây: http://docs.python.org/ library/functions.html –

0

Sử dụng dir với setattr nên thực hiện công việc

class MyClass: 
    def __init__(self): 
    self.name = None 
    self.text = None 

myclass = MyClass() 
myclass.name = 'My name' 

for prop in dir(myclass): 
    print '%s:%s'%(prop,getattr(myclass,prop)) 

print 

for prop in dir(myclass): 
    if prop[:2]!='__' and prop[-2:]!='__': 
     print prop[-2:] 
     setattr(myclass,prop,"Foo Bar") 

for prop in dir(myclass): 
    print '%s:%s'%(prop,getattr(myclass,prop))  

Nhưng hãy cẩn thận vì mã này cũng đặt '__doc__', '__init__', '__module__' tính để "Foo Bar". Vì vậy, bạn sẽ phải chăm sóc tránh những thứ nhất định được cung cấp cho bạn bởi dir (đặc biệt là những thứ bắt đầu và kết thúc bằng __ dấu gạch dưới kép).

4

Sau khi đọc từ chối Syntax For Dynamic Attribute Access Tôi đang sử dụng một lớp mixin cung cấp truy cập từ điển theo phong cách các thuộc tính của một đối tượng:

class MyClass: 
    def __init__(self): 
     self.name = None 
     self.text = None 
    def __getitem__(self, name): 
     return getattr(self, name) 
    def __setitem__(self, name, value): 
     return setattr(self, name, value) 
    def __delitem__(self, name): 
     return delattr(self, name) 
    def __contains__(self, name): 
     return hasattr(self, name) 

Trong khi vẫn có thể thiết lập các thuộc tính trực tiếp:

myclass = MyClass() 
myclass.name = "foo" 
myclass.text = "bar" 

sau đó có thể đặt chúng động:

for attr in ('name', 'text'): 
    myclass[attr] = confirm(attr, default=myclass[attr]) 
+0

Nó phải là câu trả lời được chấp nhận – TyrionGraphiste

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