Что такое "метод" в 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 объект метода создается путем упаковки (указателей на) объекта экземпляра и объект функции, только что найденный вместе в абстрактном объекте: это объект, метод. Когда объект вызывается с список аргументов, новый список аргументов создается из экземпляра объект и список аргументов, а объект функции звонил с этот новый список аргументов.