Поскольку вы упомянули Python, следующее может быть полезной иллюстрацией связи между методами и объектами в большинстве современных объектно-ориентированных языков. В двух словах, то, что они называют «методом», - это просто функция, которой передается дополнительный аргумент (как указали другие ответы), но Python делает это более явным, чем большинство языков.
# perfectly normal function
def hello(greetee):
print "Hello", greetee
# generalise a bit (still a function though)
def greet(greeting, greetee):
print greeting, greetee
# hide the greeting behind a layer of abstraction (still a function!)
def greet_with_greeter(greeter, greetee):
print greeter.greeting, greetee
# very simple class we can pass to greet_with_greeter
class Greeter(object):
def __init__(self, greeting):
self.greeting = greeting
# while we're at it, here's a method that uses self.greeting...
def greet(self, greetee):
print self.greeting, greetee
# save an object of class Greeter for later
hello_greeter = Greeter("Hello")
# now all of the following print the same message
hello("World")
greet("Hello", "World")
greet_with_greeter(hello_greeter, "World")
hello_greeter.greet("World")
Теперь сравните функцию greet_with_greeter
и метод greet
: единственное отличие - это имя первого параметра (в функции, которую я назвал «приветствующий», в методе, который я назвал «self»). Таким образом, я могу использовать метод greet
точно так же, как я использую функцию greet_with_greeter
(используя синтаксис «точка», поскольку я определил его внутри класса):
Greeter.greet(hello_greeter, "World")
Итак, я фактически превратил метод в функцию. Могу ли я превратить функцию в метод? Итак, поскольку Python позволяет вам связываться с классами после их определения, давайте попробуем:
Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")
Да, функция greet_with_greeter
теперь также называется методом greet2
. Это показывает единственное реальное различие между методом и функцией: когда вы вызываете метод «на» объекте, вызывая object.method(args)
, язык волшебным образом превращает его в method(object, args)
.
(ОО-пуристы могут утверждать, что метод отличается от функции, и если вы попадаете в продвинутый Python или Ruby - или Smalltalk! - вы начнете понимать их точку зрения. Также некоторые языки предоставляют методам специальный доступ к битам объект. Но главным концептуальным отличием остается скрытый дополнительный параметр.)