为啥 .join() 不是字符串的属性? [复制]

Posted

技术标签:

【中文标题】为啥 .join() 不是字符串的属性? [复制]【英文标题】:Why is .join() a property of string not list? [duplicate]为什么 .join() 不是字符串的属性? [复制] 【发布时间】:2021-03-01 12:07:55 【问题描述】:

在 python 中加入列表时,joinstr 的函数,所以你会这样做

>>>', '.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() 不是字符串的属性? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python 属性描述符设计:为啥要复制而不是变异?

为啥在字符串连接上使用 os.path.join?

为啥我应该更喜欢 unsafe_unretained 限定符而不是为弱引用属性赋值? [复制]

为啥以及何时在 WHERE 子句中带有条件的 LEFT JOIN 不等于在 ON 中的相同 LEFT JOIN? [复制]

为啥这个使用 INNER JOIN 的 SQL DELETE 查询不起作用? [复制]

使用对象解构赋值时,为啥将属性“名称”转换为字符串? [复制]