2012-10-17 26 views
29

Vì vậy, tôi có một lớp học, được gọi là Vertex.In danh sách đối tượng của người dùng đã xác định lớp

class Vertex: 
    ''' 
    This class is the vertex class. It represents a vertex. 
    ''' 

    def __init__(self, label): 
     self.label = label 
     self.neighbours = [] 

    def __str__(self): 
     return("Vertex "+str(self.label)+":"+str(self.neighbours)) 

Tôi muốn in một danh sách các đối tượng của lớp này, như thế này:

x = [Vertex(1), Vertex(2)] 
print x 

nhưng nó cho thấy tôi ra như thế này:

[<__main__.Vertex instance at 0xb76ed84c>, <__main__.Vertex instance at 0xb76ed86c>] 

Thực ra, tôi muốn in giá trị của Vertex.label cho mỗi đối tượng. Có cách nào để làm điều đó không?

Trả lời

39

Nếu bạn chỉ muốn in nhãn cho từng đối tượng, bạn có thể sử dụng một vòng lặp hoặc một danh sách hiểu:

print [vertex.label for vertex in x] 

Tuy nhiên, để trả lời câu hỏi ban đầu của bạn, bạn cần phải xác định phương pháp __repr__ để có được danh sách đầu ra đúng. Nó có thể là một cái gì đó đơn giản như này:

def __repr__(self): 
    return str(self) 
6

Nếu bạn muốn có một chút infos hơn trong việc bổ sung các Daniel Roseman câu trả lời:

__repr____str__ là hai việc khác nhau trong python. (lưu ý, tuy nhiên, nếu bạn đã xác định chỉ __repr__, một cuộc gọi đến class.__str__ sẽ chuyển thành một cuộc gọi đến class.__repr__)

Mục tiêu của __repr__ là rõ ràng. Ngoài ra, khi máy chủ có thể, bạn nên xác định repr để (trong trường hợp của bạn) eval(repr(instance)) == instance

Mặt khác, mục tiêu của __str__ là có thể sử dụng lại; vì vậy nó quan trọng nếu bạn phải in cá thể trên màn hình (cho người dùng, có thể), nếu bạn không cần thực hiện nó, thì không thực hiện nó (và một lần nữa, nếu str không được triển khai sẽ được gọi là repr)

Ngoài ra, khi nhập mọi thứ vào trình thông dịch Idle, nó sẽ tự động gọi đại diện repr của đối tượng của bạn. Hoặc khi bạn in một danh sách, nó gọi list.__str__ (giống hệt với list.__repr__) mà các cuộc gọi trong lượt của mình đại diện repr của bất kỳ phần tử nào chứa danh sách. Điều này giải thích các hành vi bạn nhận được và hy vọng làm thế nào để sửa chữa nó

+0

Tôi thấy, do đó, thông dịch viên được gọi đệ quy __repr __() trên bất kỳ đối tượng trong danh sách .. là đúng? – czardoz

+0

không, thông dịch viên đang gọi danh sách .__ str __() (hoặc repr, nó phụ thuộc, nhưng đó là điều tương tự) và danh sách .__ str__ trả về một chuỗi bao gồm bằng cách gọi repr của tất cả các đối tượng mà danh sách chứa – Ant

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