Что такое «метод» в Python? - PullRequest
       7

Что такое «метод» в Python?

67 голосов
/ 24 сентября 2010

Может ли кто-нибудь, пожалуйста, объяснить мне в очень простых терминах, что такое "метод" в Python?

Дело в том, что во многих уроках Python для начинающих это слово используется таким образом, как если бы новичок уже знал, что такое метод в контексте Python. Хотя я, конечно, знаком с общим значением этого слова, я понятия не имею, что означает этот термин в Python. Поэтому, пожалуйста, объясните мне, что такое метод "Pythonian".

Некоторые очень простые примеры кода будут очень полезны, поскольку картинка стоит тысячи слов.

Ответы [ 6 ]

80 голосов
/ 24 сентября 2010

Это функция, которая является членом класса:

class C:
    def my_method(self):
        print "I am a C"

c = C()
c.my_method()  # Prints "I am a C"

Просто так!

(Есть также несколько альтернативных методов, позволяющих вам контролировать отношения междукласс и функция. Но я догадываюсь из твоего вопроса, что ты спрашиваешь не об этом, а скорее об основах.)

38 голосов
/ 24 сентября 2010

Метод - это функция, которая принимает экземпляр класса в качестве первого параметра. Методы являются членами классов.

class C:
    def method(self, possibly, other, arguments):
        pass # do something here

Поскольку вы хотели знать, что это конкретно означает в Python, можно различать связанные и несвязанные методы. В Python все функции (и, как таковые, также методы) являются объектами, которые можно передавать и «играть с ними». Таким образом, разница между несвязанными и связанными методами:

1) Связанные методы

# Create an instance of C and call method()
instance = C()

print instance.method # prints '<bound method C.method of <__main__.C instance at 0x00FC50F8>>'
instance.method(1, 2, 3) # normal method call

f = instance.method
f(1, 2, 3) # method call without using the variable 'instance' explicitly

Связанные методы - это методы, которые принадлежат экземплярам класса. В этом примере instance.method привязан к экземпляру с именем instance. Каждый раз, когда вызывается связанный метод, экземпляр автоматически передается в качестве первого параметра, который по соглашению называется self.

2) Несвязанные методы

print C.method # prints '<unbound method C.method>'
instance = C()
C.method(instance, 1, 2, 3) # this call is the same as...
f = C.method
f(instance, 1, 2, 3) # ..this one...

instance.method(1, 2, 3) # and the same as calling the bound method as you would usually do

Когда вы обращаетесь к C.method (метод внутри класса, а не внутри экземпляра), вы получаете несвязанный метод. Если вы хотите вызвать его, вы должны передать экземпляр в качестве первого параметра, поскольку метод не привязан к какому-либо экземпляру.

Зная эту разницу, вы можете использовать функции / методы в качестве объектов, например, передавая методы. В качестве примера использования примера представьте API, который позволяет вам определять функцию обратного вызова, но вы хотите предоставить метод в качестве функции обратного вызова. Нет проблем, просто передайте self.myCallbackMethod как обратный вызов, и он будет автоматически вызываться с экземпляром в качестве первого аргумента. Это не было бы возможно в статических языках, таких как C ++ (или только с обманом).

Надеюсь, вы поняли;) Я думаю, это все, что вы должны знать об основах метода. Вы также можете прочитать больше о декораторах classmethod и staticmethod, но это уже другая тема.

23 голосов
/ 05 марта 2016

В Python метод - это функция, которая доступна для данного объекта из-за типа объекта .

Например, если вы создаете my_list = [1, 2, 3], метод append можно применить к my_list, потому что это список Python: my_list.append(4). Все списки имеют метод append просто потому, что они являются списками.

В качестве другого примера, если вы создаете my_string = 'some lowercase text', метод upper можно применить к my_string просто потому, что это строка Python: my_string.upper().

В списках нет метода upper, а в строках нет метода append. Зачем? Потому что методы существуют только для определенного объекта, если они были явно определены для этого типа объекта , и разработчики Python (пока) решили, что эти конкретные методы не нужны для этих конкретных объектов.

Для вызова метода используется формат object_name.method_name(), и любые аргументы метода указаны в скобках. Метод неявно действует на именуемый объект, и поэтому некоторые методы не имеют никаких заявленных аргументов, поскольку сам объект является единственным необходимым аргументом. Например, my_string.upper() не имеет перечисленных аргументов, потому что единственным обязательным аргументом является сам объект, my_string.

Одна распространенная путаница связана со следующим:

import math
math.sqrt(81)

Является ли sqrt методом объекта math? Нет. Это способ вызова функции sqrt из модуля math. Используемый формат - module_name.function_name() вместо object_name.method_name(). В общем, единственный способ провести различие между этими двумя форматами (визуально) состоит в том, чтобы просмотреть оставшуюся часть кода и посмотреть, находится ли часть до периода (math, my_list, my_string ) определяется как объект или модуль.

2 голосов
/ 17 июля 2012

Извините, но, по моему мнению, RichieHindle совершенно прав, говоря, что метод ...

Это функция, которая является членом класса.

Вот пример функции, которая становится членом класса.С тех пор он ведет себя как метод класса.Давайте начнем с класса empty и обычной функции с одним аргументом:

>>> class C:
...     pass
...
>>> def func(self):
...     print 'func called'
...
>>> func('whatever')
func called

Теперь мы добавляем член к классу C, который является ссылкой на функцию.После этого мы можем создать экземпляр класса и вызвать его метод, как если бы он был определен внутри класса:

>>> C.func = func
>>> o = C()
>>> o.func()
func called

Мы также можем использовать альтернативный способ вызова метода:

>>> C.func(o)
func called

o.func даже проявляется так же, как метод класса:

>>> o.func
<bound method C.func of <__main__.C instance at 0x000000000229ACC8>>

И мы можем попробовать обратный подход.Давайте определим класс и украдем его метод как функцию:

>>> class A:
...     def func(self):
...         print 'aaa'
...
>>> a = A()
>>> a.func
<bound method A.func of <__main__.A instance at 0x000000000229AD08>>
>>> a.func()
aaa

Пока он выглядит одинаково.Теперь функция кражи:

>>> afunc = A.func
>>> afunc(a)
aaa    

Правда в том, что метод не принимает аргумент 'what':

>>> afunc('whatever')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method func() must be called with A instance as first 
  argument (got str instance instead)

ИМХО, это не аргумент против методфункция, которая является членом класса .

Позже найден ответ Алекса Мартелли , который в основном говорит то же самое.Извините, если вы считаете это дублированием:)

0 голосов
/ 03 марта 2019

Если вы думаете, что объект похож на существительное, то метод похож на глагол.Используйте метод сразу после объекта (то есть строки или списка), чтобы применить к нему действие метода.

0 голосов
/ 31 октября 2013

http://docs.python.org/2/tutorial/classes.html#method-objects

Обычно метод вызывается сразу после его привязки:

x.f()

В примере MyClass это вернет строку 'hello world'. Однако нет необходимости вызывать метод сразу: x.f является метод объекта, и может быть сохранен и вызван позже. За Пример:

xf = x.f
while True:
    print xf()

будет продолжать печатать привет мир до конца времени.

Что именно происходит при вызове метода? Вы могли заметить что x.f () был вызван без аргумента выше, хотя в определении функции для f () указан аргумент. Что случилось с Аргумент? Конечно, Python вызывает исключение, когда функция, которая требует аргумента, вызывается без каких-либо - даже если аргумент на самом деле не используется ...

На самом деле, вы, наверное, догадались, ответ: особая вещь о методы в том, что объект передается в качестве первого аргумента функция. В нашем примере вызов x.f () в точности эквивалентен MyClass.f (х). В общем, вызов метода со списком из n аргументов эквивалентно вызову соответствующей функции с аргументом список, который создается путем вставки объекта метода перед первым аргумент.

Если вы все еще не понимаете, как работают методы, посмотрите на реализация может, возможно, прояснить вопросы. Когда атрибут экземпляра указывается, что это не атрибут данных, его класс ищется. Если имя обозначает допустимый атрибут класса, который является функциональным объектом, Объект метода создается упаковкой (указателями на) объекта экземпляра. и объект функции, только что найденный вместе в абстрактном объекте: это объект метода. Когда объект метода вызывается с список аргументов, новый список аргументов строится из экземпляра объект и список аргументов, а объект функции вызывается с этот новый список аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...