2009-12-31 53 views
88
def __repr__(self): 
    return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name, 
    self.namespace, self.regex.pattern) 

Ý nghĩa/mục đích của phương pháp này là gì?Mục đích của Python __repr__

+0

@ zjm1126: làm bạn muốn biết tại sao '>>> variable' in những gì '__repr __()' lợi nhuận? – voyager

+11

Tài liệu đó khiến mọi người ngủ. Ngoài ra, thật hữu ích khi học hỏi từ những người khác về cách sử dụng điều này. – Dombey

+0

Có thể trùng lặp của [Sự khác biệt giữa \ _ \ _ str \ _ \ _ và \ _ \ _ repr \ _ \ _ bằng Python] (http://stackoverflow.com/questions/1436703/difference-between-str-and-repr- in-python) –

Trả lời

116

__repr__ phải trả về bản trình bày có thể in của đối tượng, rất có thể là một cách có thể để tạo đối tượng này. Xem tài liệu chính thức here. __repr__ dành cho nhà phát triển trong khi __str__ dành cho người dùng cuối.

Một ví dụ đơn giản:

>>> class Point: 
... def __init__(self, x, y): 
...  self.x, self.y = x, y 
... def __repr__(self): 
...  return 'Point(x=%s, y=%s)' % (self.x, self.y) 
>>> p = Point(1, 2) 
>>> p 
Point(x=1, y=2) 
+2

lazy1: Tôi chủ yếu muốn sửa định dạng (hữu ích khi có các ví dụ phù hợp nhất có thể với những gì họ sẽ thấy trong một phiên mẫu), nhưng tôi cũng đã điều chỉnh định dạng đầu ra để rõ ràng khác với nhiệm vụ, vì điều đó cải thiện đáng kể sự rõ ràng cho một người nào đó nhầm lẫn về điều này, imho. (Nếu tôi đã đi xa, chỉ cần chỉnh sửa lại và tôi sẽ nợ bạn một ly bia.) –

+2

Đã từ chối tham chiếu: http://docs.python.org/reference/datamodel.html#object.__repr__ –

+1

Điều này có thể sử dụng% r thay vì% s: http://stackoverflow.com/questions/6005159/when-to-use-r-instead-of-s-in-python –

11

này được giải thích khá tốt trong Python documentation:

repr (object): Return một chuỗi chứa một đại diện có thể in được của một đối tượng. Đây là cùng một giá trị được tạo ra bởi các chuyển đổi (dấu ngoặc kép ngược lại). Đôi khi hữu ích khi có thể truy cập hoạt động này như một hàm bình thường. Đối với nhiều loại, hàm này cố gắng trả về một chuỗi có thể sinh ra một đối tượng có cùng giá trị khi được chuyển tới eval(), nếu không thì biểu diễn là một chuỗi được đặt trong dấu ngoặc nhọn có chứa tên của loại đối tượng cùng nhau với thông tin bổ sung thường bao gồm tên và địa chỉ của đối tượng. Một lớp có thể kiểm soát những gì hàm này trả về cho các cá thể của nó bằng cách định nghĩa một phương thức __repr __().

Vì vậy, những gì bạn thấy ở đây là triển khai mặc định __repr__, rất hữu ích cho việc tuần tự hóa và gỡ lỗi.

+5

Tôi nghĩ rằng phương pháp trích dẫn ngược (hoặc 'backticks') của việc nhận được "đại diện" của một đối tượng không được chấp nhận và bị loại bỏ cho phiên bản 3.0 – MatrixFrog

+0

MatrixFrog: cả hai đều đúng, nhưng tài liệu hiện tại 2.x vẫn nói đây là nơi trích dẫn. –

+0

Đối với nhiều đối tượng, _ \ _ repr _ \ _ và _ \ _ str _ \ _ là cùng chức năng. Trong thực tế, nếu bạn chỉ định nghĩa _ _ _ str _ \ _, thì _ \ _ repr _ \ _ mặc định chỉ gọi _ \ _ str _ \ _.Trường hợp rõ ràng nhất là điều này không đúng là các chuỗi: str ('stackoverflow') trả về 'stackoverflow' nhưng repr ('stackoverflow') là' stackoverflow''. – MatrixFrog

4

Phương pháp __repr__ chỉ đơn giản nói với Python làm thế nào để in các đối tượng của một lớp

5

__repr__ được sử dụng bởi các thông dịch viên độc lập Python để hiển thị một lớp ở định dạng có thể in được. Ví dụ:

~> python3.5 
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class StackOverflowDemo: 
...  def __init__(self): 
...   pass 
...  def __repr__(self): 
...   return '<StackOverflow demo object __repr__>' 
... 
>>> demo = StackOverflowDemo() 
>>> demo 
<StackOverflow demo object> 

Trong trường hợp một phương pháp __str__ không được định nghĩa trong lớp, nó sẽ gọi __repr__ chức năng trong một nỗ lực để tạo ra một đại diện có thể in được.

>>> str(demo) 
'<StackOverflow demo object __repr__>' 

Ngoài ra, print() vào lớp sẽ gọi __str__ theo mặc định.


Documentation, nếu bạn hài lòng