2011-01-18 24 views
15

Nếu tôi muốn truy cập danh sách các biến mẫu của đối tượng, tôi có thể gọi myObject.__dict__.keys(). Tôi muốn sử dụng thuộc tính này để in ra tất cả các biến mẫu của một đối tượng. Tôi do dự để làm điều này bởi vì __dict__ là thuộc tính "bí mật" và tôi không hiểu ý nghĩa của phương tiện this footnote.Truy cập các biến mẫu Python bằng __dict __- Có sai không?

Vì vậy, có sai khi sử dụng myObject.__dict__ không?

+4

Bạn có thể (?) Thích phong cách 'vars (myObject)', nhưng đó là trực giao cho câu hỏi của bạn. Nó cho cùng __dict__. –

Trả lời

6

Chú thích cuối trang có nghĩa là bạn không nên truy cập trực tiếp __dict__ mà thay vào đó hãy kiểm tra xem tính năng/hành vi bạn muốn có sẵn hay không.

Vì vậy, thay vì làm một cái gì đó như:

if "__some_attribute__" in obj.__dict__: 
    # do stuff 

bạn thay vì nên làm:

try: 
    obj.some_action_i_want_to_do(...) 
except AttributeError: 
    # doesn't provide the functionality I want 

Những lý do cho điều này là bởi vì đối tượng khác nhau có thể cung cấp tài liệu tham khảo nội bộ khác nhau để một hành động nhất định nhưng vẫn cung cấp đầu ra mong muốn.

Nếu bạn muốn liệt kê "nội bộ" để gỡ lỗi và kiểm tra đối tượng hiện tại, thì dir() là cách phù hợp để thực hiện.

+0

Nhưng 'dir()' chỉ cung cấp tên; '__dict__' cũng tự cung cấp cho các đối tượng. –

4

Bạn có thể sử dụng chức năng dir để liệt kê tất cả các thuộc tính của đối tượng.

-2

Theo chú thích đó, __dict__ chỉ tồn tại trên các đối tượng mô-đun.

Những gì bạn đang tìm kiếm có thể là hàm builtin dir(). Ví dụ:

>>> f = open('foo', 'w') 
>>> dir(f) 
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines'] 
+0

'__dict__' * hiện * tồn tại cho những thứ ngoài các mô-đun. Mặc dù nó không tồn tại cho tất cả các đối tượng (được xây dựng trong, những thứ có '__slots__', có lẽ là các cá thể lớp kiểu cũ?). – delnan

3

Sử dụng cho những thứ như in thành viên để gỡ lỗi sẽ không sao. Nhưng nếu đó là tất cả các bạn đang làm, hãy kiểm tra in đẹp.

http://docs.python.org/library/pprint.html

Vấn đề chính với __dict__, là vi phạm các quy tắc tầm nhìn ngụ ý của đối tượng mà python có.

+0

'__dict__' là hackery. Nó mạnh mẽ và nguy hiểm, và bạn không * cần * nó để lập trình. Đó là lý do tại sao. Rằng nó vi phạm tầm nhìn chỉ là một phần của nó. – delnan

+0

Cảm ơn bạn đã chỉ ra pprint. Tôi luôn tự hỏi liệu có một cách dễ dàng để mô phỏng việc in ấn bộ sưu tập kiểu iPython hay không. – sans

+0

Vấn đề '__dict__' này có vẻ giống như một lỗ thỏ nhưng tôi muốn hiểu nó tốt hơn. Bạn ngụ ý gì bởi các quy tắc hiển thị ngụ ý? – sans

5

Chú thích đó có liên quan đến thuộc tính __dict__ của mô-đun . Thuộc tính __dict__ của một đối tượng không có cảnh báo như vậy (documentation).

+0

Có những cảnh báo tương tự cho các đối tượng khi người truy cập, metaclasses hoặc khe cắm được sử dụng. Các ngoại lệ rất rẻ trong Python mà chúng được sử dụng để kết thúc lặp lại trong các trình tạo. – Apalala

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