python:如何覆盖str.join?

python:如何覆盖str.join?,python,string,subclass,Python,String,Subclass,我们有一个子类str(称之为MyStr),我需要能够控制str.join如何与我的子类交互 至少,所有MyStr的连接应该产生另一个MyStr,而MyStr和“普通”str的连接应该抛出一个TypeError 目前,情况就是这样:(MyStr子类unicode) 你的类不能重写加入: class MyStr(unicode): def join(self, strs): # your code here 这将至少涵盖MyStr(…).join(…) 在@bukzor的评

我们有一个子类str(称之为MyStr),我需要能够控制str.join如何与我的子类交互

至少,所有MyStr的连接应该产生另一个MyStr,而MyStr和“普通”str的连接应该抛出一个TypeError

目前,情况就是这样:(MyStr子类unicode)


你的类不能重写
加入

class MyStr(unicode):
    def join(self, strs):
        # your code here
这将至少涵盖
MyStr(…).join(…)

在@bukzor的评论之后,我查看了它的工作原理,它看起来像是一个C函数,当使用
unicode
分隔符调用时,它总是返回
unicode
对象

。看看
PyUnicode\u Join
函数,尤其是这一行:

res = _PyUnicode_New(res_alloc);
因此,
PyUnicode\u 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()
是一种
str
方法。如果您想在之后得到一个
MyStr
对象,您需要使用
MyStr
ojbect来进行连接


如果你想要一个
TypeError
,你就不必继承
str
,而是自己提供
str
的所有方法(至少是你需要的方法)。不过,这很可能会使它们在正常的字符串操作中基本上没有用处。

@Brendan Long,Raymond Hettinger:这行不通。请参阅:@bukzor-你说得对,重载
\uuuu add\uuuu
不足以使
“:”。join([MyStr(“a”),“a”)
失败。也许
join
使用格式字符串?或者它可能只是一个C函数。因为另一部分(重载
join
)确实有效,所以我把这一部分删掉了。看看unicode.join实现(Objects/unicodeobject.c:PyUnicode\u join),它看起来只是无条件地将所有内容转换为unicode。类似地,如果任何项是unicode(或子类),str.join实现将调用unicode.join@雷蒙德·海廷格:我说得对吗?@Brendan Long:这让我很难过,但似乎是真的。现在我需要将这个对象转换为非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;
}
':'.join( [MyStr('A'), 'B', u'C'] )