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


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

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

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

5 59

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 просто потому, что это питон строка:my_string.upper().

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

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

один общий момент путаницы касается следующего:

import math
math.sqrt(81)

и sqrt метод

Извините, но-на мой взгляд-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

The 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    

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

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

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