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

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

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

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

5 ответов


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

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

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

просто!

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


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

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 декораторы, но это другая тема.


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

например, если вы создаете 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 метод


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

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

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

истина заключается в том, что метод не признавать 'что' аргументы:

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

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

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


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

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

x.f()

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

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

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

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

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

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