运营商和方法之间是否存在实质性差异?
我看到的唯一区别是被称为的方式,它们是否有其他差异?
例如在Python连接中,切片,索引定义为运算符,而(指代字符串)upper()
,replace()
,strip()
等等是方法。
答案 0 :(得分:2)
你的问题相当广泛。对于您的示例,使用特殊语法(例如,[]
)在字符串和列表上定义连接,切片和索引。但其他类型可能会做不同的事情。
事实上,大多数(我认为所有)运算符的行为都由magic methods控制,所以当你写x + y
之类的东西时,一个方法就会被调用。
从实际角度来看,主要区别之一是可用的语法运算符集是固定的,而新的代码运算符不能由Python代码添加。您无法编写自己的代码来定义名为$
的新运算符,然后使x $ y
起作用。另一方面,您可以根据需要定义任意数量的方法。这意味着您应该仔细选择分配给运营商的行为(如果有的话);因为只有有限数量的操作员,所以你要确保不要在不常见的操作中“浪费”它们。
答案 1 :(得分:1)
如果我理解当前的问题......
简而言之,一切都是对象的方法。您可以在operators。
中的python魔术类方法中找到“表达式运算符”方法那么,为什么python有“性感”的东西,如[x:y]
,[x]
,+
,-
?因为对大多数开发人员来说这是常见的事情,即使对开发人员不熟悉,所以像+
,-
这样的数学函数会吸引人眼,他会知道会发生什么。与索引类似 - 它是许多语言中的常用语法。
但是没有特殊方式来表达upper
,replace
,strip
方法,因此没有“表达式运算符”。
那么,“表达式运算符”和方法之间有什么不同,我只会说它的外观。
答案 2 :(得分:1)
运营商和运营商之间是否存在实质性差异? 方法
实际上,没有区别因为每个运算符都映射到特定的Python special method。此外,每当Python遇到运算符的使用时,它都会隐式调用其关联的特殊方法。例如:
1 + 2
隐式调用int.__add__
,这使得上面的表达式等同于 1 :
(1).__add__(2)
以下是演示:
>>> class Foo:
... def __add__(self, other):
... print("Foo.__add__ was called")
... return other + 10
...
>>> f = Foo()
>>> f + 1
Foo.__add__ was called
11
>>> f.__add__(1)
Foo.__add__ was called
11
>>>
当然,实际使用(1).__add__(2)
代替1 + 2
效率低(而且很丑!),因为它涉及使用.
运算符进行不必要的名称查找。
尽管如此,我认为通常不会将运算符符号(+
,-
,*
等)视为相关方法名称的简写({ {1}},__add__
,__sub__
等)。毕竟,他们每个人都会通过调用相同的方法来做同样的事情。
1 好吧,大致相当。正如文档here所述,是一组特殊方法,前缀为处理反映操作数的字母__mul__
。例如,以下表达式:
r
实际上可能相当于:
A + B
如果B.__radd__(A)
未实现A
,__add__
实施B
。