2012-11-09 29 views
8

Các mã như thế này:cách truy cập biến lớp theo chuỗi trong Python?

class Test: 
    a = 1 
    def __init__(self): 
     self.b=2 

Khi tôi làm một thể hiện của Test, tôi có thể truy cập vào dụ nó biến b như thế này (bằng cách sử dụng chuỗi "b"):

test = Test() 
a_string = "b" 
print test.__dict__[a_string] 

Nhưng nó không hoạt động cho aself.__dict__ không chứa khóa có tên a. Sau đó, làm cách nào tôi có thể truy cập a nếu tôi chỉ có một chuỗi a?

Cảm ơn!

+0

Lý do 'self .__ dict__' không chứa khóa có tên' a' là nó nằm trong 'self .__ class __.__ dict__'. Nếu bạn thực sự muốn làm mọi thứ theo cách thủ công, bạn có thể đọc lên trên thứ tự tìm kiếm cho các thuộc tính và kiểm tra mọi thứ theo cùng một thứ tự… nhưng bạn thực sự không muốn làm việc theo cách thủ công. (Bạn sẽ phải đối phó với các vùng, thuộc tính, các lớp kiểu cổ điển và mới, tùy chỉnh '__dict__'s, mô tả tùy chỉnh và tất cả các thứ khác thú vị để tìm hiểu nhưng không liên quan trực tiếp đến việc giải quyết vấn đề của bạn.) – abarnert

+1

PS, vì đây rõ ràng là Python 2.x, bạn có thể muốn 'kiểm tra lớp (đối tượng)' ở đây, trừ khi bạn có một lý do cụ thể để tránh các lớp kiểu mới. Ngay cả đối với các chương trình thử nghiệm đơn giản, nó cũng đáng để tham gia vào thói quen. (Và đặc biệt là đối với các chương trình thử nghiệm dựa hoàn toàn vào cách thức mà hai loại lớp khác nhau ...) – abarnert

Trả lời

21
getattr(test, a_string) 

cộng với một số ký tự khác để tôi có thể đăng.

9

sử dụng getattr cách này để làm những gì bạn muốn:

test = Test() 
a_string = "b" 
print getattr(test, a_string) 
4

Hãy thử điều này:

class Test:  
    a = 1  
    def __init__(self): 
     self.b=2 

test = Test()  
a_string = "b" 
print test.__dict__[a_string] 
print test.__class__.__dict__["a"] 
1

Bạn có thể sử dụng:

getattr(Test, a_string, default_value)

với một số thứ ba trở về một số default_value trong trường hợp a_string không phải là được tìm thấy trên lớp Test.

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