2010-09-21 23 views
11

print OBJECT gọi OBJECT.__str__(), sau đó khi gọi OBJECT.__repr__()? Tôi thấy rằng print OBJECT gọi OBJECT.__repr__() khi OBJECT.__str__() không tồn tại, nhưng tôi hy vọng đó không phải là cách duy nhất để gọi __repr__().Khi __repr __() được gọi?

Trả lời

19
repr(obj) 

gọi

obj.__repr__ 

mục đích __repr__ là nó cung cấp một biểu diễn 'chính thức' của đối tượng được coi là một biểu thức có thể được eval ed để tạo ra các đối tượng. có nghĩa là,

obj == eval(repr(obj)) 

nên, nhưng không phải lúc nào trong thực tế, mang lại True

tôi được hỏi trong các ý kiến ​​cho một ví dụ khi obj != eval(repr(obj)).

class BrokenRepr(object): 
    def __repr__(self): 
     return "not likely" 

đây là một số khác:

>>> con = sqlite3.connect(':memory:') 
>>> repr(con) 
'<sqlite3.Connection object at 0xb773b520>' 
>>> 
+0

Tại sao obj == eval (repr (obj)) không phải lúc nào cũng cung cấp đúng? Bạn có thể đưa ra một ví dụ? – inspectorG4dget

+1

Đối với một đối tượng phức tạp, chẳng hạn như một tệp, nó sẽ không nhất thiết trả về True. – Avi

+1

@ inspectorG4dget: obj == eval (loại ('myclass',(), {})) –

3

repr(obj) cuộc gọi obj.__repr__.

Điều này nhằm mục đích mô tả rõ ràng đối tượng, đặc biệt cho mục đích gỡ lỗi. More info in the docs

+0

@ S.Lott cảm ơn vì đã chỉ ra lỗi đánh dấu của tôi, nó đã được sửa ngay bây giờ. Tôi chỉ không biết bạn đang đề cập đến những nguyên tắc nào. –

1

Trong trăn 2.x, `` `obj `` will end up calling obj. repr() . It's shorthand for repr() `.

+1

-1: Cú pháp không được chấp nhận, cú pháp sẽ bị xóa. –

+0

@S. Lott: Lưu ý trong câu trả lời – recursive

7

Không chỉ __repr__() được gọi khi bạn sử dụng repr(), mà còn trong các trường hợp sau:

  1. Bạn gõ obj trong vỏ và nhấn nhập
  2. Bạn đã bao giờ in một đối tượng trong một cuốn từ điển/tuple/list. Ví dụ: print [u'test'] không in ['test']
+0

Cảm ơn bạn vì điều này! –

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