调用函数的目的没有括号python

use*_*142 18 python python-3.x

考虑以下:

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();
Run Code Online (Sandbox Code Playgroud)

此代码返回

>>>
False
False
True 
False
Run Code Online (Sandbox Code Playgroud)

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

roi*_*ppi 24

如上所述,函数和方法是一流的对象.你通过在末尾抛出一些括号(括号)来调用它们.但看起来你想要更多的动机,为什么python甚至让我们这样做.如果功能是一流的,我们为什么要关心?

有时您不想调用它们,您希望传递对callable本身的引用.

from multiprocessing import Process
t = Process(target=my_long_running_function)
Run Code Online (Sandbox Code Playgroud)

如果你把括号放在上面,它会my_long_running_function在你的主线程中运行你的; 几乎没有你想要的!您希望为Process您的callable 提供一个引用它将在新进程中运行的引用.

有时你只想指定可调用的东西并让别的东西......

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

map(do_something,['hey','what up','yo'])
Out[3]: ['YEH', 'PU TAHW', 'OY']
Run Code Online (Sandbox Code Playgroud)

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

也许你只想将一堆callables放入一些集合中,然后以动态的方式获取你想要的那个.

from operator import *

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

以上是将运算符的字符串表示映射到其实际操作的一种方法.


Mar*_*som 18

Python中的函数和方法也是对象本身.因此,您可以像对待任何其他对象一样比较它们.

>>> type(a.get_value)
<type 'instancemethod'>
>>> type(a.get_value())
<type 'int'>
Run Code Online (Sandbox Code Playgroud)

通常情况下,你不会将方法与其他方法或其他任何方法进行比较,因为它并不是非常有用.一个有用的地方是你想将一个函数传递给另一个函数.

  • 要简要地扩展Mark的注释,当你输入``a.get_value``并且最后没有parens时,你实际上并没有调用这个方法.您只是引用与该方法关联的对象. (3认同)

vor*_*nin 7

def mul(a, b):
    return a * b

def add(a, b):
    return a + b

def do(op, a, b):
    return op(a, b)

do(add, 2, 3)  # return 5
Run Code Online (Sandbox Code Playgroud)


Mor*_*sen 6

print(a.get_value() == b.get_value)   # 1
print(a.get_value() == b.get_value()) # 2
print(a.get_value == b.get_value)     # 3
Run Code Online (Sandbox Code Playgroud)

1)调用a.get_value()的返回值等于方法b.get_value吗?

2)a.get_value()是否返回与b.get_value()相同?

3)方法参考a.get_value是否等于方法参考b.get_value?

这是完全有效的Python :)