我们有一个str的子类(称之为MyStr),我需要能够控制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'
答案 0 :(得分:5)
您的班级无法覆盖join
:
class MyStr(unicode):
def join(self, strs):
# your code here
这至少会涵盖MyStr(...).join(...)
在@ bukzor的评论之后,我查看了它是如何工作的,看起来join是一个C函数,在使用unicode
分隔符调用时总是返回unicode
个对象。
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'] )
答案 1 :(得分:0)
join()
是一种str
方法。如果您想在之后使用MyStr
对象,则可以使用MyStr
ojbect进行连接。
如果您想要TypeError
,则必须不继承str
并自行提供所有str
方法(至少是您需要的方法)。但是,很有可能这会使它们对正常的字符串操作毫无用处。