2010-08-24 30 views
18

Vâng đoạn python console tương tác này sẽ nói lên tất cả:Làm thế nào để áp dụng __str__ chức năng khi in một danh sách các đối tượng trong Python

>>> class Test: 
...  def __str__(self): 
...   return 'asd' 
... 
>>> t = Test() 
>>> print(t) 
asd 
>>> l = [Test(), Test(), Test()] 
>>> print(l) 
[__main__.Test instance at 0x00CBC1E8, __main__.Test instance at 0x00CBC260, 
__main__.Test instance at 0x00CBC238] 

Về cơ bản tôi muốn để có được ba asd chuỗi in khi tôi in danh sách. Tôi cũng đã thử pprint nhưng nó cũng cho kết quả tương tự.

Trả lời

3

Bạn cần phải thực hiện một phương pháp __repr__:

>>> class Test: 
    def __str__(self): 
     return 'asd' 
    def __repr__(self): 
     return 'zxcv' 


>>> [Test(), Test()] 
[zxcv, zxcv] 
>>> print _ 
[zxcv, zxcv] 

Tham khảo docs:

object.__repr__(self)

Được gọi bởi hàm repr() được tích hợp sẵn và bằng chuyển đổi chuỗi (dấu ngoặc kép) để tính toán biểu diễn chuỗi “chính thức” của một đối tượng. Nếu có thể, điều này sẽ giống như một biểu thức Python hợp lệ có thể được sử dụng để tạo lại một đối tượng có cùng giá trị (được đưa ra một môi trường thích hợp). Nếu điều này là không thể, một chuỗi các hình thức <...some useful description...> nên được trả lại. Giá trị trả về phải là một đối tượng chuỗi. Nếu một lớp xác định __repr__() nhưng không phải là __str__() thì __repr__() cũng được sử dụng khi biểu diễn chuỗi “không chính thức” về các phiên bản của lớp đó là bắt buộc.

Điều này thường được sử dụng để gỡ lỗi, vì vậy điều quan trọng là đại diện là thông tin phong phú và rõ ràng.

+0

Từ tài liệu được cung cấp trong câu trả lời, có vẻ như tôi không cần định nghĩa __str__ nếu __repr__ được sử dụng. Cảm ơn về thông tin bạn vừa nhập. – dvim

+1

@Blink_: Tùy thuộc vào chính xác bạn muốn gì. Sử dụng lớp tôi đã định nghĩa, so sánh đầu ra của 'print Test()' với 'print [Test()]'. –

9

Đề xuất trong các câu trả lời khác để triển khai __repr__ chắc chắn là một khả năng. Nếu đó là không khả thi vì lý do gì (loại hiện có, __repr__ cần thiết vì lý do khác hơn là thẩm mỹ, vv), sau đó chỉ cần làm

print [str(x) for x in l] 

hoặc, như một số chắc chắn sẽ đề nghị, (nhỏ gọn hơn chỉ là một chút) map(str, l).

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