小编典典

不带括号的调用函数的目的python

python

考虑以下:

class objectTest():

    def __init__(self, a):
        self.value = a

    def get_value(self):
        return self.value

class execute():

    def __init__(self):
        a = objectTest(1)
        b = objectTest(1)

        print(a == b)
        print(a.get_value() == b.get_value)
        print(a.get_value() == b.get_value())
        print(a.get_value == b.get_value)

if __name__ == '__main__':
    execute = execute()

此代码返回

>>>
False
False
True 
False

鉴于get_value是一个函数,我希望执行停止并返回错误,但事实并非如此。有人可以解释为什么python解释器允许这种语法而不是引发属性错误,在我看来,这可以节省我宝贵的时间。


阅读 200

收藏
2020-12-20

共1个答案

小编典典

如前所述,函数和方法是一流的对象。您通过在末尾加上一些括号(括号)来 称呼
它们。但是看来您想要更多的动机来解释为什么python甚至允许我们这样做。我们为什么要关心函数是否一流?

有时您不想调用它们,而是想传递对可调用对象本身的引用。

from multiprocessing import Process
t = Process(target=my_long_running_function)

如果在上述内容后面加上方括号,它将my_long_running_function在主线程中运行;几乎没有你想要的!您想Process引用可调用对象,它将在新进程中运行。

有时您只想指定可调用对象,然后再做其他事情…

def do_something(s):
    return s[::-1].upper()

map(do_something,['hey','what up','yo'])
Out[3]: ['YEH', 'PU TAHW', 'OY']

map在这种情况下)填写其参数。

也许您只想将一堆可调用对象放入某个集合中,并以动态方式获取您想要的那些。

from operator import *

str_ops = {'<':lt,'>':gt,'==':eq} # etc
op = str_ops.get(my_operator)
if op:
    result = op(lhs,rhs)

以上是将运算符的字符串表示形式映射到其实际动作的一种方法。

2020-12-20