Python: Почему некоторые функции идут перед переменной? [Дубликат]

Java - это вызов по значению.

Как это работает.

  • Вы всегда передаете копию бит значения ссылки!
  • Если это примитивный тип данных, эти биты содержат значение самого примитивного типа данных. Поэтому, если мы изменим значение заголовка внутри метода, то оно не отражает изменения вне.
  • Если это тип данных объекта, например Foo foo = new Foo (), тогда в этом случае копия адреса объекта проходит как ярлык файла, предположим, что у нас есть текстовый файл abc.txt на C: \ desktop, и предположим, что мы делаем ярлык тот же файл и поместите его внутри C: \ desktop \ abc-shortcut, поэтому, когда вы получаете доступ к файлу из C: \ desktop \ abc.txt и пишите 'Stack Overflow' и закрываете файл, и снова вы открываете файл из ярлыка, тогда вы пишете «является крупнейшим онлайн-сообществом для программистов, чтобы узнать», тогда общее изменение файла будет «Stack Overflow - это самое большое онлайн-сообщество для программистов, чтобы учиться», что означает, что не имеет значения, откуда вы открываете файл e, каждый раз, когда мы обращались к одному и тому же файлу, здесь мы можем считать Foo как файл и предположим, что foo хранится на адресе 123hd7h (исходный адрес, например C: \ desktop \ abc.txt) и 234jdid (скопированный адрес, например C: \ desktop \ abc-shortcut, который фактически содержит исходный адрес файла внутри). Поэтому для лучшего понимания создайте файл ярлыка и почувствуйте ...
39
задан Community 23 May 2017 в 12:34
поделиться

4 ответа

Функция является вызываемым объектом в 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'>
42
ответ дан Krumelur 16 August 2018 в 01:50
поделиться
  • 1
    Я согласен, что метод является подмножеством функции. Я бы не сказал, что функция - любой вызываемый объект. Класс вызываем, но я бы не назвал его функцией. – BrenBarn 7 January 2014 в 23:06
  • 2
    Методы - это функции, связанные с конкретными классами, верно? – Barmar 7 January 2014 в 23:07
  • 3
    Метод связан с классом, метод bound связан с экземпляром класса. – Krumelur 7 January 2014 в 23:08
  • 4
    @BrenBarn Правда, я изменил формулировку. – Krumelur 7 January 2014 в 23:09
  • 5
    Как следует из сообщения об ошибке в вашем последнем примере, действительно можно вызвать несвязанный метод. Вам просто нужно передать экземпляр в качестве первого аргумента. – BrenBarn 7 January 2014 в 23:10

В принципе, да, Python их отличает, но в Python обычно рассматривать методы как подмножество функций. Методы связаны с классом или экземпляром, а «автономные функции» - нет. Что-то, что является методом, также является функцией, но могут быть функции, которые не являются методами.

Как отметил Джон Клементс в своем комментарии, это отличие не так уж и холодно, как на C ++. Автономные функции могут быть «преобразованы» в методы во время выполнения, а методы могут быть назначены переменным таким образом, чтобы они действовали не иначе, как автономные функции. Таким образом, граница между методами и функциями проницаема.

2
ответ дан BrenBarn 16 August 2018 в 01:50
поделиться
  • 1
    Но указывает ли оператор-точка в упомянутых функциях / методах связать их со строковым объектом? И, например, len () автономная функция, которая принимает строковый объект в качестве аргумента? – Q-bertsuit 7 January 2014 в 23:18
  • 2
    Да, те, у которых есть точка, являются методами, и да len - функция. – BrenBarn 7 January 2014 в 23:19
  • 3
    @ Q-bertsuit & quot; Методы связаны с классом или экземпляром, и "автономные функции" не. & quot; Однако то, что появляется в пространстве имен __dict__ класса, это функции, а не методы. ,,,, "Что-то, что является методом, также является функцией & quot; . Метод больше, чем функция sinc, это упаковка функции и экземпляра. Посмотрите, что я опишу в своем ответе, пожалуйста. Что ты думаешь об этом ? – eyquem 8 January 2014 в 02:24
  • 4
    @eyquem Хотя я ценю время и усилия, которые вы вложили в свой ответ, это немного над моей головой. Я только начинаю изучать Python, и пока я рад, что методы и функции имеют более сложные определения, чем то, к чему я привык. Спасибо за ваше время! +1 – Q-bertsuit 8 January 2014 в 10:13
6
ответ дан eyquem 16 August 2018 в 01:50
поделиться

В следующем определении класса:

class MyClass:
    """A simple example class"""
    def f(self):
        return 'hello world'
  • Класс: MyClass
  • Функция: f ()
  • Метод: Нет (на самом деле, неприменимо)

Позволяет создать экземпляр вышеуказанного класса. Мы сделаем это, назначив class object, i.e. MyClass() на var x

  x = MyClass()

Здесь

  • Функция: Нет
  • Метод: xf ()

И не забывайте, что function object MyClass.f использовался для определения (внутри) method object x.f, когда мы назначили x к MyClass ()

2
ответ дан ketan 16 August 2018 в 01:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: