2011-11-02 70 views
2

我們有一個str的子類(稱之爲MyStr),我需要能夠控制str.join如何與我的子類進行交互。python:如何覆蓋str.join?

至少,所有MyStr的連接應該產生另一個MyStr,並且MyStr和「plain」str的連接應該會引發TypeError。

目前,這是發生了什麼:(myStr的子類的unicode)

>>> m = MyStr(':') 

>>> m.join([MyStr('A'), MyStr('B')]) 
u'A:B' 

>>> ':'.join([MyStr('A'), 'B', u'C']) 
u'A:B:C' 

回答

5

未能類只重寫join

class MyStr(unicode): 
    def join(self, strs): 
     # your code here 

這將至少覆蓋MyStr(...).join(...)

的情況下

@ bukzor的評論之後,我查了一下它是如何工作的,看起來join是一個C函數,它總是返回一個當使用unicode分隔符呼叫時使用0對象。

The code can be seen here。看看在PyUnicode_Join功能,尤其是這一行:

res = _PyUnicode_New(res_alloc); 

所以,PyUnicode_Join結果永遠是PyUnicode一個實例。

的唯一錯誤的情況下,我可以看到的是,如果輸入的不是Unicode:

/* Convert item to Unicode. */ 
if (! PyUnicode_Check(item) && ! PyString_Check(item)) { 
    PyErr_Format(PyExc_TypeError, 
       "sequence item %zd: expected string or Unicode," 
       " %.80s found", 
       i, Py_TYPE(item)->tp_name); 
    goto onError; 
} 

所以我不認爲這是可能使這種情況下失敗(至少,而不是在你的對象從延伸unicode):

':'.join([MyStr('A'), 'B', u'C']) 
+0

這很簡單:-) –

+0

@Brendan Long,Raymond Hettinger:這是行不通的。請看:http://pastebin.com/3kuTXG1T – bukzor

+0

@bukzor - 你說得對,重載'__add__'不足以使'':「。join([MyStr(」a「),」a「]) '失敗。也許'join'使用格式化字符串?或者它可能只是一個C函數。自從另一部分(超載「連接」)確實起作用以後,我拿出了那部分內容。 –

0

join()str方法。如果你想最終得到一個MyStr對象,你可以使用一個MyStr ojbect來完成連接。

如果你想要一個TypeError你不得不繼承str並且自己提供所有str的方法(至少是你需要的方法)。但是,這很可能會使它們在正常的字符串操作中變得很無用。