Java - это вызов по значению.
Как это работает.
Функция является вызываемым объектом в Python, то есть может быть вызвана с помощью оператора вызова (хотя другие объекты могут эмулировать функцию путем реализации __call__
). Например:
>>> def a(): pass
>>> a
<function a at 0x107063aa0>
>>> type(a)
<type 'function'>
Метод является специальным классом функции, который может быть связан или несвязанным .
>>> class A:
... def a(self): pass
>>> A.a
<unbound method A.a>
>>> type(A.a)
<type 'instancemethod'>
>>> A().a
<bound method A.a of <__main__.A instance at 0x107070d88>>
>>> type(A().a)
<type 'instancemethod'>
Конечно, несвязанный метод нельзя вызывать (по крайней мере, не напрямую, не передавая экземпляр как аргумент):
>>> A.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method a() must be called with A instance as first argument (got nothing instead)
В Python в большинстве случаев вы не заметят разницу между связанным методом, функцией или вызываемым объектом (т. е. объектом, который реализует __call__
), или конструктором класса. Все они выглядят одинаково, у них просто разные соглашения об именах. Под капотом объекты могут выглядеть значительно иначе.
Это означает, что связанный метод может использоваться как функция, это одна из многих мелких вещей, которая делает Python настолько мощным
>>> b = A().a
>>> b()
Это также означает, что хотя между len(...)
и str(...)
существует принципиальное различие (последний является конструктором типа), вы не заметите разницу, пока не будете копать немного глубже:
>>> len
<built-in function len>
>>> str
<type 'str'>
В принципе, да, Python их отличает, но в Python обычно рассматривать методы как подмножество функций. Методы связаны с классом или экземпляром, а «автономные функции» - нет. Что-то, что является методом, также является функцией, но могут быть функции, которые не являются методами.
Как отметил Джон Клементс в своем комментарии, это отличие не так уж и холодно, как на C ++. Автономные функции могут быть «преобразованы» в методы во время выполнения, а методы могут быть назначены переменным таким образом, чтобы они действовали не иначе, как автономные функции. Таким образом, граница между методами и функциями проницаема.
len
- функция.
– BrenBarn
7 January 2014 в 23:19
__dict__
класса, это функции, а не методы. ,,,, "Что-то, что является методом, также является функцией & quot; i>. Метод больше, чем функция sinc, это упаковка функции и экземпляра. Посмотрите, что я опишу в своем ответе, пожалуйста. Что ты думаешь об этом ?
– eyquem
8 January 2014 в 02:24
В следующем определении класса:
class MyClass:
"""A simple example class"""
def f(self):
return 'hello world'
Позволяет создать экземпляр вышеуказанного класса. Мы сделаем это, назначив class object, i.e. MyClass()
на var x
x = MyClass()
Здесь
И не забывайте, что function object MyClass.f
использовался для определения (внутри) method object x.f
, когда мы назначили x к MyClass ()