有人能简单解释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!-你会开始明白他们的观点。此外,一些语言赋予方法特殊的对象访问权限。但主要的概念区别仍然是隐藏的额外参数。)

其他回答

OOP是一种设计理念。在这种情况下,“方法”是一个“动作”,一个对象的“行为”,一种“操作”,是一个对象所做的事情。右键单击鼠标对象是一个动作。在实现OOP设计的几种语言中,这种行为被称为“方法”。“函数”仅与C和Pascal等过程语言相关,与OOP哲学无关,即使在技术上实现与方法类似。“函数”是程序语言(如C)中的一块代码,它有一个定义的目的,一个独立的和定义的功能,也可以返回结果。“过程”也是一个不返回结果的函数,但它只是技术上的区别。

让我们不要过于复杂化,这应该是一个非常简单的答案。方法和功能是一样的。当函数在类外部时,可以将其称为函数,当函数在一个类内部编写时,可以称其为方法。

“method”是“function”的面向对象词。这几乎就是它的全部(即,没有真正的区别)。

不幸的是,我认为这里的很多答案都在延续或推进一种观点,即存在一些复杂而有意义的差异。

真的-没有那么多,只是对同一件事用不同的词。

[后期添加]


事实上,正如BrianNeal在对这个问题的评论中指出的那样,C++标准在引用成员函数时从不使用“方法”一词。有些人可能认为这表明C++并不是真正的面向对象语言;然而,我更倾向于将其作为一种迹象,即一群相当聪明的人并不认为有特别强烈的理由使用不同的术语。

对于一阶近似,方法(在C++风格的OO中)是成员函数的另一个词,即作为类一部分的函数。

在像C/C++这样的语言中,您可以使用不是类成员的函数;不能调用与类a方法无关的函数。

函数是一个数学概念。例如:

f(x,y) = sin(x) + cos(y)

表示函数f()将返回第一个参数的sin加上第二个参数的余弦。这只是数学。碰巧sin()和cos()也是函数。函数有另一个属性:对具有相同参数的函数的所有调用都应返回相同的结果。

另一方面,方法是与面向对象语言中的对象相关的函数。它有一个隐式参数:被作用的对象(及其状态)。

因此,如果对象Z具有方法g(x),则可能会看到以下内容:

Z.g(x) = sin(x) + cos(Z.y)

在这种情况下,传入参数x,与前面的函数示例相同。然而,cos()的参数是位于对象Z内部的值。Z和位于对象Z内的数据(Z.y)是Z的g()方法的隐式参数。