有人能简单解释OOP环境中的方法与函数吗?
当前回答
既然您提到了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:唯一的区别是第一个参数的名称(在函数中我称它为“greeter”,在方法中我称其为“self”)。因此,我可以以与使用greet_with_greeter函数完全相同的方式使用greet方法(使用“dot”语法,因为我在类中定义了它):
Greeter.greet(hello_greeter, "World")
所以我已经有效地将一个方法变成了一个函数。我能把函数变成方法吗?好吧,因为Python允许您在定义类之后处理它们,所以让我们尝试:
Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")
是的,函数greet_with_greeter现在也称为方法greet2。这显示了方法和函数之间唯一真正的区别:当您通过调用object.method(args)“对”对象调用方法时,语言会神奇地将其转换为方法(object,args)。
(OO纯粹主义者可能会认为方法与函数不同,如果你进入高级Python或Ruby-或Smalltalk!-你会开始明白他们的观点。此外,一些语言赋予方法特殊的对象访问权限。但主要的概念区别仍然是隐藏的额外参数。)
其他回答
“method”是“function”的面向对象词。这几乎就是它的全部(即,没有真正的区别)。
不幸的是,我认为这里的很多答案都在延续或推进一种观点,即存在一些复杂而有意义的差异。
真的-没有那么多,只是对同一件事用不同的词。
[后期添加]
事实上,正如BrianNeal在对这个问题的评论中指出的那样,C++标准在引用成员函数时从不使用“方法”一词。有些人可能认为这表明C++并不是真正的面向对象语言;然而,我更倾向于将其作为一种迹象,即一群相当聪明的人并不认为有特别强烈的理由使用不同的术语。
假设函数是一个代码块(通常有自己的作用域,有时也有自己的闭包),它可以接收一些参数,也可以返回结果。
方法是由对象拥有的函数(在某些面向对象的系统中,更正确的说法是由类拥有)。被对象/类“拥有”意味着您通过对象/类引用方法;例如,在Java中,如果要调用对象“door”拥有的方法“open()”,则需要编写“door.open()”。
通常,方法还会获得一些额外的属性,描述它们在对象/类中的行为,例如:可见性(与面向对象的封装概念相关),它定义了可以从哪些对象(或类)调用方法。
在许多面向对象的语言中,所有的“函数”都属于某个对象(或类),因此在这些语言中没有不是方法的函数。
简单的记忆方式:
作用→ 免费(免费意味着它可以在任何地方,不需要在对象或类中)方法→ 成员(对象或类的成员)
函数和方法之间主要区别的非常一般的定义:
函数在类外部定义,而方法在类内部和类的一部分定义。
对于一阶近似,方法(在C++风格的OO中)是成员函数的另一个词,即作为类一部分的函数。
在像C/C++这样的语言中,您可以使用不是类成员的函数;不能调用与类a方法无关的函数。