运算符和方法之间的区别

时间:2014-07-08 18:27:15

标签: python methods operators

运营商和方法之间是否存在实质性差异?

我看到的唯一区别是被称为的方式,它们是否有其他差异?

例如在Python连接中,切片,索引定义为运算符,而(指代字符串)upper()replace()strip()等等是方法。

3 个答案:

答案 0 :(得分:2)

你的问题相当广泛。对于您的示例,使用特殊语法(例如,[])在字符串和列表上定义连接,切片和索引。但其他类型可能会做不同的事情。

事实上,大多数(我认为所有)运算符的行为都由magic methods控制,所以当你写x + y之类的东西时,一个方法就会被调用。

从实际角度来看,主要区别之一是可用的语法运算符集是固定的,而新的代码运算符不能由Python代码添加。您无法编写自己的代码来定义名为$的新运算符,然后使x $ y起作用。另一方面,您可以根据需要定义任意数量的方法。这意味着您应该仔细选择分配给运营商的行为(如果有的话);因为只有有限数量的操作员,所以你要确保不要在不常见的操作中“浪费”它们。

答案 1 :(得分:1)

如果我理解当前的问题......

简而言之,一切都是对象的方法。您可以在operators

中的python魔术类方法中找到“表达式运算符”方法

那么,为什么python有“性感”的东西,如[x:y][x]+-?因为对大多数开发人员来说这是常见的事情,即使对开发人员不熟悉,所以像+-这样的数学函数会吸引人眼,他会知道会发生什么。与索引类似 - 它是许多语言中的常用语法。

但是没有特殊方式来表达upperreplacestrip方法,因此没有“表达式运算符”。

那么,“表达式运算符”和方法之间有什么不同,我只会说它的外观。

答案 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