Вопрос-Ответ

What does it mean when the parentheses are omitted from a function or method call?

Что это значит, когда круглые скобки опущены при вызове функции или метода?

У меня есть этот пример кода:

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

def get_value(self):
return self.value

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)

Отображаемые результаты:

False
False
True
False

Почему это не вызывает ошибку? get_value это метод, так почему мы можем использовать его таким образом, не вызывая его сначала?


Смотрите также: Что означает '<функция в ...>' в Python?

Переведено автоматически
Ответ 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)

Вышесказанное является одним из способов сопоставления строковых представлений операторов с их фактическим действием.

Ответ 2

Функции и методы в Python также являются самими объектами. Таким образом, вы можете сравнивать их так же, как и любой другой объект.

>>> type(a.get_value)
<type 'instancemethod'>
>>> type(a.get_value())
<type 'int'>

Обычно, конечно, вы не стали бы сравнивать методы друг с другом или что-либо еще, потому что это не очень полезно. Одно место, где это полезно, - когда вы хотите передать функцию в другую функцию. Одним из распространенных способов является сортировка строк без учета регистра с указанием использовать str.lower в качестве метода для генерации ключа сортировки:

>>> list_of_strings=['A','b','C']
>>> sorted(list_of_strings)
['A', 'C', 'b']
>>> sorted(list_of_strings, key=str.lower)
['A', 'b', 'C']
Ответ 3
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
Ответ 4
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) Является ли возвращаемое значение вызова a.get_value() равным методу b.get_value ?

2) a.get_value() Возвращает то же самое, что и b.get_value() ?

3) Ссылка на метод a.get_value равна ссылке на метод b.get_value ?

Это совершенно допустимый Python :)

python python-3.x