Purpose of calling function without brackets python

匿名 (未验证) 提交于 2019-12-03 01:12:01

问题:

Consider the following:

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();

This code return

>>> False False True  False

Given that get_value is a function, I would expect the execution to stop and return an error, but it doesn't. Can somebody explain why the python interpreter allow this kind of syntax instead of raising an attribute error, which in my case would have saved me precious time.

回答1:

As mentioned, functions and methods are first-class objects. You call them by throwing some parentheses (brackets) on the end. But it looks like you want some more motivation for why python even lets us do that. Why should we care if functions are first-class or not?

Sometimes you don't want to call them, you want to pass a reference to the callable itself.

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

If you put brackets after the above, it runs your my_long_running_function in your main thread; hardly what you wanted! You wanted to give Process a reference to your callable that it will run itself in a new process.

Sometimes you just want to specify the callable and let something else...

def do_something(s):     return s[::-1].upper()  map(do_something,['hey','what up','yo']) Out[3]: ['YEH', 'PU TAHW', 'OY']

(map in this case) fill in its arguments.

Maybe you just want to drop a bunch of callables into some collection, and fetch the one you want in a dynamic manner.

from operator import *  str_ops = {'':gt,'==':eq} # etc op = str_ops.get(my_operator) if op:     result = op(lhs,rhs)

The above is one way to map string representations of operators onto their actual action.



回答2:

Functions and methods in Python are also objects themselves. Thus you can compare them just as you would any other object.

>>> type(a.get_value)  >>> type(a.get_value())

Normally of course you wouldn't compare methods to each other or anything else, because it's not terribly useful. One place it's useful is when you want to pass a function into another function.



回答3:

print(a.get_value() == b.get_value)   # 1 print(a.get_value() == b.get_value()) # 2 print(a.get_value == b.get_value)     # 3

1) Is return value of calling a.get_value() equal to the method b.get_value ?

2) Does a.get_value() return the same as b.get_value() ?

3) Is the method-reference a.get_value equal to the method-reference b.get_value ?

This is perfectly valid Python :)



回答4:

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!