2010-09-11 35 views
50

Tôi thực sự không hiểu đâu là __str____repr__ được sử dụng trong Python. Ý tôi là, tôi nhận được rằng __str__ trả về biểu diễn chuỗi của một đối tượng. Nhưng tại sao tôi lại cần nó? Trong trường hợp sử dụng kịch bản nào? Ngoài ra, tôi đọc về cách sử dụng __repr__Mục đích của __str__ và __repr__ là gì?

Nhưng những gì tôi không hiểu là, tôi sẽ sử dụng chúng ở đâu?

+8

http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python – miku

+4

Đối với bất cứ ai đến từ Ruby, tl; dr là: '__str__' =' to_s 'và' __repr__' = 'kiểm tra'. – Ajedi32

Trả lời

59

__repr__

gọi bởi repr() chức năng built-in và chuyển đổi chuỗi (đảo ngược dấu ngoặc kép) để tính toán chuỗi đại diện "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).

__str__

gọi bởi str() chức năng built-in và báo cáo kết quả in để tính toán "không chính thức" chuỗi đại diện của một đối tượng.

Sử dụng __str__ nếu bạn có một lớp học và bạn sẽ muốn có đầu ra thông tin/không chính thức, bất cứ khi nào bạn sử dụng đối tượng này như một phần của chuỗi. Ví dụ. bạn có thể định nghĩa các phương thức __str__ cho các mô hình Django, sau đó được hiển thị trong giao diện quản trị Django. Thay vì một cái gì đó giống như <Model object> bạn sẽ nhận được như tên đầu tiên và cuối cùng của một người, tên và ngày một sự kiện vv


__repr____str__ tương tự, trên thực tế đôi khi bằng nhau (Ví dụ từ BaseSet lớp trong sets.py từ thư viện tiêu chuẩn):

def __repr__(self): 
    """Return string representation of a set. 

    This looks like 'Set([<list of elements>])'. 
    """ 
    return self._repr() 

# __str__ is the same as __repr__ 
__str__ = __repr__ 
+1

Cảm ơn! Điều này thật đúng với gì mà tôi đã tìm kiếm! – Daniel

+0

những gì 'return self._repr()' hiện, khi tôi chạy mã và cố gắng hiểu nó nói __repr __() lấy chính xác một đối số. – shining

+0

Vì vậy, tôi có thể sử dụng '__repr__' thay vì' __str__' django không? –

10

Grasshopper, khi nghi ngờ go to the mountainread the Ancient Texts. Trong đó, bạn sẽ thấy rằng __repr __() nên:

Nếu có thể, nó 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ị.

+3

-1 vì điều này thậm chí không cố gắng trả lời câu hỏi thực tế, đó là những trường hợp sử dụng. –

+3

@Scott: Bạn đã đúng. Nhưng sau đó một lần nữa * câu hỏi thực tế * cho thấy hoàn toàn không có nỗ lực để đi đến các tài liệu chính ở nơi đầu tiên. Đó là một câu hỏi đặt ra câu hỏi cho thấy bạn đã cố gắng trả lời nó cho chính mình nhưng vẫn còn hơi bối rối về một số khía cạnh của nó, và một điều nữa hoàn toàn là để đăng một câu hỏi như thế này. Chỉ cần gõ vào dòng chủ đề của mình như là một câu hỏi mới cho thấy rằng 5 trong số 6 đề xuất SO đề xuất hàng đầu sẽ trả lời câu hỏi của mình, nhưng anh không thể bị làm phiền. Tôi đã không hoàn toàn cho anh ta một câu trả lời lmgtfy, nhưng tôi đã bị cám dỗ. –

+1

Thực ra anh ta đã nói rằng anh ta đã đọc về '__repr__', các tài liệu chính thức không thực sự trả lời câu hỏi là tại sao bạn sử dụng nó, và chỉ vì một câu hỏi được trả lời ở đâu đó không phải là lý do chính đáng cũng không được trả lời trên SO (thường là không phải Googling sẽ đưa bạn trở lại đây!) Nếu bạn không nghĩ rằng câu hỏi đáng trả lời thì bạn có thể không trả lời, mặc dù trong trường hợp này tôi đồng ý rằng nó được bảo hiểm rất tốt đã có trên SO và do đó liên kết đến các bản sao sẽ là một phản ứng thích hợp. –

43

Một nơi mà bạn sử dụng chúng cả hai rất nhiều trong một phiên tương tác. Nếu bạn in một đối tượng sau đó phương pháp __str__ của nó sẽ được gọi, trong khi nếu bạn chỉ cần sử dụng một đối tượng bằng cách riêng của mình sau đó __repr__ của nó được hiển thị:

>>> from decimal import Decimal 
>>> a = Decimal(1.25) 
>>> print(a) 
1.25     <---- this is from __str__ 
>>> a 
Decimal('1.25')  <---- this is from __repr__ 

Các __str__ được thiết kế để được như con người có thể đọc được càng tốt, trong khi __repr__ nên hướng đến mục tiêu có thể được sử dụng để tạo lại đối tượng, mặc dù nó thường không chính xác cách nó được tạo ra, như trong trường hợp này.

Cũng không bình thường đối với cả hai số __str____repr__ để trả lại cùng một giá trị (chắc chắn cho các loại được cài sẵn).

4

Tạo và trả lời các câu trả lời trước đó và hiển thị một số ví dụ khác. Nếu được sử dụng đúng cách, sự khác biệt giữa strrepr là rõ ràng.Trong ngắn repr nên trả về một chuỗi có thể được sao chép để xây dựng lại trạng thái chính xác của đối tượng, trong khi str hữu ích cho các kết quả gỡ lỗi loggingobserving. Dưới đây là một số ví dụ để xem các kết quả đầu ra khác nhau cho một số thư viện đã biết.

Datetime

print repr(datetime.now()) #datetime.datetime(2017, 12, 12, 18, 49, 27, 134411) 
print str(datetime.now())  #2017-12-12 18:49:27.134452 

Các str là tốt để in vào một tập tin nhật ký, nơi như repr có thể được tái có mục tiêu nếu bạn muốn chạy nó trực tiếp hoặc đổ nó như lệnh vào một file.

x = datetime.datetime(2017, 12, 12, 18, 49, 27, 134411) 

NumPy

print repr(np.array([1,2,3,4,5])) #array([1, 2, 3, 4, 5]) 
print str(np.array([1,2,3,4,5])) #[1 2 3 4 5] 

trong NumPy các repr là một lần nữa trực tiếp tiêu hao.

Tuỳ chỉnh Vector3 dụ

class Vector3(object): 
    def __init__(self, args): 
     self.x = args[0] 
     self.y = args[1] 
     self.z = args[2] 

    def __repr__(self): 
     return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z) 

    def __str__(self): 
     return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z) 

Trong ví dụ này, repr trở lại một chuỗi có thể được tiêu thụ trực tiếp/thực hiện, trong khi str là hữu ích hơn như một kết xuất debug.

v = Vector3([1,2,3]) 
print repr(v) #Vector3([1,2,3]) 
print str(v)  #Vector(x:1, y:2, z:3) 

Một điều cần lưu ý, nếu str không được định nghĩa nhưng repr, str sẽ tự động gọi repr. Vì vậy, nó luôn luôn tốt để ít nhất xác định repr

0

str sẽ định dạng không chính thức và có thể đọc được trong khi repr sẽ cung cấp cho đại diện đối tượng chính thức.

class Complex: 
    # Constructor 
    def __init__(self, real, imag): 
     self.real = real 
     self.imag = imag 

    # "official" string representation of an object 
    def __repr__(self): 
     return 'Rational(%s, %s)' % (self.real, self.imag) 

    # "informal" string representation of an object (readable) 
    def __str__(self): 
     return '%s + i%s' % (self.real, self.imag) 

    t = Complex(10, 20) 

    print (t)  # this is usual way we print the object 
    print (str(t)) # this is str representation of object 
    print (repr(t)) # this is repr representation of object 

Answers : 

Rational(10, 20) # usual representation 
10 + i20  # str representation 
Rational(10, 20) # repr representation 
Các vấn đề liên quan