有人能简单解释OOP环境中的方法与函数吗?


当前回答

函数是一组可以用来处理数据的逻辑。

而Method是一个用于处理其所属对象的数据的函数。因此,从技术上讲,如果您有一个与您的类不完全相关但在类中声明的函数,那么它不是一个方法;这被称为糟糕的设计。

其他回答

为了我:如果我同意:

函数可以返回值可能需要参数

就像任何一段代码一样,你可能有你放入的对象,你可能会有一个作为结果出现的对象。在这样做的过程中,他们可能会改变对象的状态,但这不会改变他们对我的基本功能。

调用对象或其他代码的函数时可能存在定义差异。但这不就是语言差异的原因吗?这就是为什么人们会互换它们?上面提到的计算示例我会小心处理。因为我雇佣员工来计算:

new Employer().calculateSum( 8, 8 );

通过这样做,我可以依靠雇主负责计算。如果他想要更多的钱,我会让他自由,让碳水化合物收集者处理闲置员工的职能来完成剩下的工作,并雇佣一名新员工。

即使争论一个方法是一个对象函数,而一个函数是不相连的计算,这也无助于我。函数描述符本身以及理想的函数文档将告诉我它需要什么以及它可能返回什么。其余的,比如操纵某个对象的状态,对我来说并不是真正透明的。我确实希望函数和方法都能传递和操纵它们所声称的内容,而不需要详细了解它们是如何做到的。即使是纯计算函数也可能更改控制台的状态或附加到日志文件。

使用C#术语,函数和方法之间有区别。术语“函数成员”不仅包括方法,还包括其他非数据成员,如索引器、运算符、构造函数、析构函数和财产,所有成员都包含可执行代码。

reference=>专业C#和.NET 2021版-由Christina Nagel编写

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

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

在C++中,有时使用方法来反映类的成员函数的概念。然而,最近我在《C++编程语言第四版》一书中发现了一个声明,第586页“派生类”

虚函数有时称为方法。

这有点令人困惑,但他说,有时,C++创建者倾向于将方法视为可以在对象上调用的函数,并且可以表现为多态。