Python中的一切都是对象,为什么操作符不是?

Python中的一切都是对象,为什么操作符不是?,python,operators,Python,Operators,Python中的一切都是对象 我们都知道这句话,所有的蟒蛇主义者(包括我)都喜欢它。在这方面,研究运营商很有趣。它们似乎不是物体,例如 >>> type(*) # or /, +, -, < ... 因此操作(1,2,+)将返回3,操作(1,2,*)将返回2,操作(1,2'),并通过相应操作符的字符串表示找到所需的操作。然而,我要问的是,为什么不存在运算符对象可以作为参数在函数中传递,例如像其他所有python对象一样。每个值都是一个对象。运算符不是值;它们是语

Python中的一切都是对象

我们都知道这句话,所有的蟒蛇主义者(包括我)都喜欢它。在这方面,研究运营商很有趣。它们似乎不是物体,例如

>>> type(*)     # or /, +, -, < ...
因此
操作(1,2,+)
将返回
3
操作(1,2,*)
将返回
2
操作(1,2')
,并通过相应操作符的字符串表示找到所需的操作。然而,我要问的是,为什么不存在运算符对象可以作为参数在函数中传递,例如像其他所有python对象一样。

每个值都是一个对象。运算符不是值;它们是语法。但是,它们是由函数实现的,函数是值。
操作员
模块提供对这些功能的访问


一种语言可以提供额外的语法来将运算符转换为“名称”,这一点对Python完全不适用,尽管这很有启发性。例如,在Haskell中,可以使用中缀运算符,如
+
,就好像它是使用括号的名称一样。当您想用Python编写
操作(3,5,+)
时,Haskell允许
操作35(+)


没有任何技术原因可以解释为什么不能将类似的东西添加到Python中,但也没有令人信服的设计理由来添加它。
操作符
模块就足够了,并且更“适合”整个语言设计。

操作符告诉解释器在提供的对象上操作的底层方法,因此它们更像函数,在某种意义上仍然是对象,您只需要适当的引用来调用
类型
。例如,假设您有
Foo.some_方法
,您想查找它的类型。您需要正确的引用:
type(Foo.some\u方法)
,而不仅仅是
type(some\u方法)
,前者返回
,后者返回
名称错误

也就是说,您当然可以在不使用
操作符的情况下实现这样的功能:

def operation(operand1, operand2, operator):
    return getattr(operand1, operator)(operand2)

operation(1, 2, '__add__')
# 3

也就是说,理解问题的最简单方法是,运算符是python解释代码的语法的一部分,而不是实际对象。因此,当解释器看到
*
+
~
等时。。。它需要两个操作数来获取别名方法并执行。方法本身就是一个对象。语法,没有那么多。

你可以把操作符看作是一种语法糖。例如,
3+4
只是
int.\uuuuuu add\uuuuuu(3,4)
的语法糖。而
type(int.\uu add\uu)
不是None,但是
type(+)
会引起错误。

你说:


按预期打印
5

这是一个很好的问题示例。
从技术上讲,要正确回答这个问题,除了对声明、注释和空行进行编码外,还可以使用词汇分析器(标记器)方法来表示标记类别

除了运算符之外,还有:i)换行、缩进和缩进、ii)关键字和iii)分隔符都不是对象其他所有内容都是Python中的对象

所以下次他们告诉你“Python中的一切都是对象”时,你应该回答:
“逻辑行中不是换行符、缩进、删除、空格字符、运算符、关键字或分隔符的所有内容都是Python中的对象。”

这里的基本原理是:当Python设计人员设计语言时,他们认为这些标记类别在任何情况下都不能作为对象处理,否则就无法通过其他方式解决。

干杯。

操作员模块适用。您只需要更改调用语法。如果
操作符
模块在这里不适用,您是什么意思?@StefanPochmann:我的意思是,不可能使用
操作符
模块中的方法按照我定义的方式调用
操作
函数。或者不是吗?这是问题的一部分!啊,你的意思就是这样,用那个符号?然后是否,不适用于
操作员
模块。但这个符号启发了我的答案:——)
def operation(operand1, operand2, operator):
    return getattr(operand1, operator)(operand2)

operation(1, 2, '__add__')
# 3
    # The following line is invalid python code and should only describe the function
    return operand1 <operator> operand2
def operation(operand1, operand2, operator):
    """
    This function returns the operation of two operands defined by the operator as parameter
    """
    return operand1 <operator> operand2

class Subtraction:
    def __gt__(self, operand):
        try:
            return self.operand - operand
        except:
            self.operand = operand
            return self

print(operation(13, 8, Subtraction()))