为啥 .join() 不是字符串的属性? [复制]
Posted
技术标签:
【中文标题】为啥 .join() 不是字符串的属性? [复制]【英文标题】:Why is .join() a property of string not list? [duplicate]为什么 .join() 不是字符串的属性? [复制] 【发布时间】:2021-03-01 12:07:55 【问题描述】:在 python 中加入列表时,join
是str
的函数,所以你会这样做
>>>', '.join(['abc', '123', 'zyx'])
'abc, 123, zyx'
我觉得将它作为list
(或任何迭代器)的属性会更直观,
>>>['abc', '123', 'zyx'].join(', ')
'abc, 123, zyx'
这是为什么?
【问题讨论】:
如果你有一个整数或任意对象的列表怎么办? 因为join
是在字符串上定义的,所以您可以使用它来连接任何序列,而不仅仅是一个列表:一个元组、一个集合、一个生成器。甚至是我自己编写的一些可迭代类型。将它放在 str 上比在 list 上有用得多。
像 javascript 一样将它们转换成字符串...
【参考方案1】:
.join()
是 str
对象的属性,而不是 list
。不幸的是,像 javascript 一样,无法向内置对象添加自定义方法,但您可以创建新类,例如:
class MyString:
def __init__(self, string):
self.string = string
def join(self,sep):
return sep.join(self.string)
mystring = MyString("this is the string")
print(mystring.join())
要获取原始字符串,请使用mystring.string
,您可以应用普通的python属性和方法
【讨论】:
值得一提的是.split()
也是str
的一个方法。所以这两个操作都属于同一类型。
他不是问为什么它不在列表中吗?它已经在 str 模块上实现,并以 list 作为参数...【参考方案2】:
基本上,join 只适用于字符串列表;它不做任何类型强制。加入包含一个或多个非字符串元素的列表将引发异常。 你可以在文章中找到原因:http://www.faqs.org/docs/diveintopython/odbchelper_join.html
【讨论】:
【参考方案3】:真正的原因可能只能由 Python 背后的开发人员和思想家给你,但我会尝试给它一个刺戳。
首先,如果你加入了列表,那么这个操作对于任意对象的列表意味着什么?例如,如果您有一个 HttpClient 对象列表,连接的结果会是什么?答案是,一开始就问这样的问题可能是无效的,因为我们不能为连接任意对象赋予任何意义。
其次,即使该操作是 String objects API 的一部分,它也不会使其成为对某个任意其他类的对象的操作。这意味着如果您有一个需要对列表进行 .join() 操作的用例,那么您可以创建一个特殊的列表类来实现此行为。您可以使用继承或组合来实现这一点,无论您喜欢哪一种。
【讨论】:
以上是关于为啥 .join() 不是字符串的属性? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我应该更喜欢 unsafe_unretained 限定符而不是为弱引用属性赋值? [复制]
为啥以及何时在 WHERE 子句中带有条件的 LEFT JOIN 不等于在 ON 中的相同 LEFT JOIN? [复制]