2012-02-16 53 views
6

Làm thế nào để nối Object với một chuỗi (nguyên thủy) mà không quá tải và loại diễn viên rõ ràng (str())?Làm thế nào để nối `Object` bằng một chuỗi?

class Foo: 
    def __init__(self, text): 
     self.text = text 

    def __str__(self): 
     return self.text 


_string = Foo('text') + 'string' 

Output:

Traceback (most recent call last): 
    File "test.py", line 10, in <module> 
     _string = Foo('text') + 'string' 

TypeError: unsupported operand type(s) for +: 'type' and 'str' 

hành + phải bị quá tải? Có cách nào khác không (chỉ tự hỏi)?

PS: Tôi biết về quá tải khai thác và gõ đúc (như str(Foo('text')))

+0

Kết quả mong đợi của bạn trong _string là gì? "chuỗi văn bản"? – Rod

+0

Tôi muốn trả về một chuỗi. chỉ cần tự hỏi! – tomas

+3

Tại sao bạn không muốn sử dụng 'str' để buộc đối tượng vào một chuỗi? – Marcin

Trả lời

10

Chỉ cần xác định __add__()__radd__() phương pháp:

class Foo: 
    def __init__(self, text): 
     self.text = text 
    def __str__(self): 
     return self.text 
    def __add__(self, other): 
     return str(self) + other 
    def __radd__(self, other): 
     return other + str(self) 

Chúng sẽ được gọi tùy thuộc vào việc bạn có Foo("b") + "a" (gọi số __add__()) hoặc "a" + Foo("b") (gọi số __radd__()).

+1

IMO đây không phải là thực hành tốt. Gọi 'str' rõ ràng là mẫu đúng. Dù sao, bạn vẫn đang gọi 'str' ở đây, bạn chỉ đang giấu nó. – Daenyth

+0

@Được rồi, tôi nghĩ nó phụ thuộc vào hoàn cảnh. Điều này không phù hợp với bất kỳ đối tượng cũ nào; nhưng đối với một cái gì đó có nghĩa là để thi đua một chuỗi, nó hoàn toàn hợp lý. – senderle

+0

@Denyeny: Tôi đồng ý với bạn, nhưng có thể có ngoại lệ. –

4
_string = Foo('text') + 'string' 

Vấn đề với dòng này là Python nghĩ rằng bạn muốn thêm một string đến một đối tượng kiểu Foo, không phải là khác xung quanh.

Nó sẽ làm việc tuy nhiên nếu bạn muốn viết:

_string = "%s%s" % (Foo('text'), 'string') 

EDIT

Bạn có thể thử nó với

_string = 'string' + Foo('text') 

Trong trường hợp này đối tượng Foo của bạn sẽ tự động được đúc vào một chuỗi.

+1

Bạn có chắc chắn về bản chỉnh sửa của mình không? Tôi khá chắc chắn rằng Python sẽ không tự động bỏ chuỗi. –

+0

@Constantinius, Thanx cho anwer, nhưng tôi biết về 'loại casting'. Tôi muốn hiểu làm thế nào để trả về chuỗi thực từ '__str__' – tomas

+1

Không có điều gì như Python đúc đối tượng thành chuỗi. Phương thức '__add__' sẽ làm điều đó một cách rõ ràng hoặc không ai làm được. – JBernardo

1

Nếu có ý nghĩa cho đối tượng Foo của bạn, bạn có thể quá tải phương pháp __add__ như sau: sản lượng

class Foo: 
    def __init__(self, text): 
     self.text = text 

    def __str__(self): 
     return self.text 

    def __add__(self, other): 
     return str(self) + other 

_string = Foo('text') + 'string' 
print _string 

Ví dụ:

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