如何让自定义StringPlus类兼容Python的.join()方法?
解决StringPlus兼容str.join()的方法
方案一:让StringPlus继承str类
str.join()要求传入的可迭代对象里的元素必须是字符串类型,直接让StringPlus继承str,把它变成字符串的子类,就能被join()直接处理。因为str是不可变类型,得用__new__方法创建实例,再附加额外数据:
class StringPlus(str): def __new__(cls, string: str, extra_data): # 先创建基础的str实例 instance = super().__new__(cls, string) # 绑定额外数据到实例 instance._extra_data = extra_data return instance # 验证代码 a = StringPlus("a", [1, 2, 3]) b = "".join([a, "b"]) assert b == "ab" # 额外数据可正常访问 assert a._extra_data == [1,2,3]
方案二:提前将实例转为字符串(仅限能控制输入时)
如果你能在把列表传给第三方库前做处理,就把列表里的StringPlus实例批量转成字符串:
# 处理列表,转换StringPlus实例为字符串 processed_list = [str(item) if isinstance(item, StringPlus) else item for item in your_list] # 再传入第三方库 third_party_lib_function(processed_list)
这个方法仅适用于你能干预输入数据的场景,要是完全无法控制第三方库的调用流程,方案一更可靠。
注意:仅实现__str__方法没用,因为str.join()不会自动将非字符串对象转为字符串,会直接抛出类型错误。
内容的提问来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

