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