算子与方法的区别

2024-06-02 09:55:59 发布

您现在位置:Python中文网/ 问答频道 /正文

运算符和方法之间有什么实质性的区别吗?在

我看到的唯一区别是他们的称呼方式,他们还有其他不同吗?在

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


Tags: 方法字符串定义方式切片运算符upperreplace
3条回答

Is there any substantial difference between operators and methods?

实际上,因为每个操作符都映射到一个特定的Python special method,所以没有区别。而且,每当Python遇到运算符的使用时,它都会隐式调用其关联的特殊方法。例如:

1 + 2

隐式调用^{},这使得上面的表达式等价于1

^{pr2}$

下面是一个演示:

>>> 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)代替{}将是低效的(而且很难看!)因为它涉及到使用.运算符进行不必要的名称查找。在

也就是说,我不认为通常将运算符符号(+-*,等等)看作是它们关联的方法名(__add____sub____mul__等)的简写。毕竟,通过调用相同的方法,它们最终都做了相同的事情。在


1嗯,大致相当。如文档所述,here是一组以字母r为前缀的处理反射操作数的特殊方法。例如,以下表达式:

A + B

可能实际上相当于:

B.__radd__(A)

如果A不实现__add__,而是B实现{}。在

如果我现在能理解这个问题。。。在

简而言之,一切都是对象的方法。您可以在operators中的python魔术类方法中找到“表达式运算符”方法。在

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

但是没有特殊的方法来表示upperreplacestrip方法,因此没有用于它的“表达式运算符”。在

所以,“表达式运算符”和方法的区别,我只想说它看起来的样子。在

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

事实上,大多数(我认为所有)操作符的行为都是由magic methods来解释的,所以当你写一些类似x + y的东西时,一个方法就在幕后被调用了。在

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

相关问题 更多 >