Подтвердить что ты не робот

Что такое "метод" в Python?

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

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

Какой-то очень простой примерный код будет очень оценен, поскольку изображение стоит тысячи слов.

4b9b3361

Ответ 1

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

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

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

Просто как это!

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

Ответ 2

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

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 в качестве обратного вызова, и он будет автоматически вызываться с экземпляром в качестве первого аргумента. Это было бы невозможно в статических языках, таких как С++ (или только с обманом).

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

Ответ 3

В 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) определяется как объект или модуль.

Ответ 4

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

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

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

>>> 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    

Истина заключается в том, что метод не принимает аргумент "any":

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

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

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

Ответ 5

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 аргументов эквивалентно вызову соответствующей функции с аргументом список, созданный путем вставки объекта методов до первого аргумент.

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

Ответ 6

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

Ответ 7

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

Метод вызывается по его имени, тогда как он связан с объектом.

Метод - это безупречность, передаваемая объекту, в котором он запрашивается.

Он может или не может вернуть любые данные.

Метод может оперировать данными, содержащимися в соответствующем классе.

Метод является важной функцией для Концепции Python, которая очень необходима для понимания.