有人可以在OOP上下文中提供方法与函数的简单解释吗?
甲函数是一段代码由名字叫做.它可以传递数据来操作(即参数),并且可以选择性地返回数据(返回值).传递给函数的所有数据都是显式传递的.
甲方法是一段代码,由与对象相关联的名称叫.在大多数方面,除了两个主要区别外,它与功能相同:
方法隐式传递调用它的对象.
方法能够对包含在类中的数据进行操作(记住对象是类的实例 - 类是定义,对象是该数据的实例).
(这是一个简化的解释,忽略范围等问题)
方法是在一个对象上.
函数独立于对象.
对于Java,只有方法.
对于C,只有函数.
对于C++,它取决于你是否在课堂上.
'method'是'function'的面向对象的单词.这就是它的全部内容(即,没有真正的区别).
不幸的是,我认为这里的许多答案都在延续或提出一些复杂而有意义的差异.
真的 - 它没有那么多,只是同一个词的不同的词.
[后期补充]
事实上,正如Brian Neal在对这个问题的评论中指出的那样,C++标准在引用成员函数时从不使用术语"方法".有些人可能会认为这表明C++并不是真正的面向对象语言; 但是,我更愿意将其视为一个非常聪明的人群并不认为有一个特别强烈的理由使用不同的术语.
通常:方法是属于类的函数,函数可以在代码的任何其他范围内,因此您可以声明所有方法都是函数,但并非所有函数都是方法:
采取以下python示例:
class Door: def open(self): print 'hello stranger' def knock_door: a_door = Door() Door.open(a_door) knock_door()
给出的示例显示了一个名为"Door"的类,它有一个名为"open"的方法或操作,它被称为方法,因为它是在类中声明的.还有另一部分代码,下面是"def",它定义了一个函数,它是一个函数,因为它没有在类中声明,这个函数调用我们在类中定义的方法,你可以看到,最后函数是自己称呼.
正如您所看到的,您可以在任何地方调用函数,但是如果要调用方法,则必须传递与声明方法的类相同类型的新对象(Class.method(object)),或者必须调用对象内部的方法(object.Method()),至少在python中.
把方法想象成只有一个实体可以做的事情,所以如果你有一个Dog类,那么只在该类中有一个bark函数是有意义的,那将是一个方法,如果你还有一个Person类,它可能有意义写一个函数"feed",因为它不属于任何类,因为人和狗都可以被喂食,你可以称之为函数,因为它不属于任何类.
简单的记忆方式:
˚F油膏→ ˚F REE(不含是指不属于一个对象或类)
M ethod→ M ember(对象或类的成员)
函数和方法之间主要区别的一般定义:
函数在类之外定义,而方法在类的内部和部分类中定义.
如果你想在这里阅读"我对OO方法的介绍"
面向对象范式背后的想法是"威胁"软件由......好"对象"组成.现实世界中的对象具有属性,例如,如果您有员工,员工有姓名,员工ID,职位,他属于部门等.
该对象还知道如何处理其属性并对它们执行某些操作.如果我们想知道员工现在在做什么,我们会问他.
employe whatAreYouDoing.
"whatAreYouDoing"是发送给对象的"消息".该对象知道如何回答这些问题,据说它有一个"方法"来解决这个问题.
因此,对象必须公开其行为的方式称为方法.因此,方法是工件对象必须"做"某事.
其他可能的方法是
employee whatIsYourName employee whatIsYourDepartmentsName
等等
另一方面,函数是编程语言计算某些数据的方式,例如,您可能具有返回16的函数addValues(8,8).
// pseudo-code function addValues( int x, int y ) return x + y // call it result = addValues( 8,8 ) print result // output is 16...
由于第一种流行的编程语言(例如fortran,c,pascal)没有涵盖OO范例,因此它们只调用这些工件"功能".
例如,C中的前一个函数将是:
int addValues( int x, int y ) { return x + y; }
说一个对象有一个"函数"来执行一些动作并不是"自然的",因为函数与数学东西更相关,而一个Employee几乎没有数学,但是你可以拥有与函数完全相同的方法,例如在Java中,这将是等效的addValues函数.
public static int addValues( int x, int y ) { return x + y; }
看起来很熟悉?这是因为Java源于C语言的C++和C++.
最后只是一个概念,在实现中它们可能看起来相同,但在OO文档中这些被称为方法.
这是Java中以前的Employee对象的示例.
public class Employee { Department department; String name; public String whatsYourName(){ return this.name; } public String whatsYourDeparmentsName(){ return this.department.name(); } public String whatAreYouDoing(){ return "nothing"; } // Ignore the following, only set here for completness public Employee( String name ) { this.name = name; } } // Usage sample. Employee employee = new Employee( "John" ); // Creates an employee called John // If I want to display what is this employee doing I could use its methods. // to know it. String name = employee.whatIsYourName(): String doingWhat = employee.whatAreYouDoint(); // Print the info to the console. System.out.printf("Employee %s is doing: %s", name, doingWhat ); Output: Employee John is doing nothing.
然后,差异在于应用它的"域".
AppleScript有"自然语言"的概念,在某些时候OO有.比如Smalltalk.我希望您在阅读本文后理解对象中的方法可能更为合理.
注意:代码不是要编译的,只是作为一个例子.随意修改帖子并添加Python示例.
在OO世界中,这两者通常用于表示相同的事物.
从纯数学和CS的角度来看,当使用相同的参数(f(x,y)=(x + y))调用时,函数将始终返回相同的结果.另一方面,方法通常与类的实例相关联.尽管如此,大多数现代OO语言在大多数情况下不再使用术语"功能".许多静态方法可能非常类似于函数,因为它们通常没有状态(并非总是如此).
假设一个函数是一个代码块(通常有自己的作用域,有时候有自己的闭包)可能会收到一些参数并且也可能返回一个结果.
方法是一个由对象拥有的函数(在某些面向对象的系统中,说它属于一个类更为正确).由对象/类"拥有"意味着您通过对象/类引用该方法; 例如,在Java中,如果要调用对象"door"所拥有的方法"open()",则需要编写"door.open()".
通常,方法还获得一些额外的属性来描述它们在对象/类中的行为,例如:可见性(与面向对象的封装概念相关),它定义了可以调用方法的对象(或类).
在许多面向对象的语言中,所有"函数"都属于某个对象(或类),因此在这些语言中没有不是方法的函数.
方法是类的功能.在通常的行话中,人们互相交换方法和功能.基本上你可以认为它们是同一个东西(不确定全局函数是否被称为方法).
http://en.wikipedia.org/wiki/Method_(computer_science)
函数是一种数学概念.例如:
f(x,y) = sin(x) + cos(y)
表示函数f()将返回添加到第二个参数的余弦的第一个参数的sin.这只是数学.因为它发生了sin()和cos()也是函数.函数具有另一个属性:对具有相同参数的函数的所有调用都应返回相同的结果.
另一方面,方法是与面向对象语言中的对象相关的功能.它有一个隐含参数:被操作的对象(和它的状态).
因此,如果您有一个带有方法g(x)的对象Z,您可能会看到以下内容:
Z.g(x) = sin(x) + cos(Z.y)
在这种情况下,传入参数x,与之前的函数示例相同.但是,cos()的参数是一个存在于对象Z内的值.Z和它内部的数据(Zy)是Z的g()方法的隐式参数.
函数或方法是一段命名的可调用代码,它执行一些操作并可选地返回一个值.
在C语言中使用术语函数.Java&C#人会说它是一个方法(在这种情况下,函数是在类/对象中定义的).
一个C++程序员可以称之为一个函数或有时方法(取决于如果他们写程序风格的C++代码或正在做的C面向对象的方式++,还有C/C++只是程序员可能会调用它的函数,因为术语"方法"是在C/C++文献中较少使用).
你只需要调用它的名字即可使用函数,
result = mySum(num1, num2);
你可以通过首先引用它的对象来调用方法,比如
result = MyCalc.mySum(num1,num2);
从历史上看,可能存在一种微妙的差异,"方法"是不返回值的东西,而"功能"则是一种微妙的差异.每种语言都有自己的具有特殊含义的术语词汇.
在"C"中,"功能"一词表示程序例程.
在Java中,术语"函数"没有任何特殊含义.而"方法"是指形成类实现的例程之一.
在C#中将翻译为:
public void DoSomething() {} // method public int DoSomethingAndReturnMeANumber(){} // function
但实际上,我重申这两个概念确实没有区别.如果你在关于Java的非正式讨论中使用术语"函数",人们会认为你的意思是"方法"并继续.不要在适当的文档或关于Java的演示文稿中使用它,否则你会看起来很傻.
函数是一组可用于操作数据的逻辑.
而Method是用于操纵它所属对象的数据的函数.从技术上讲,如果你有一个与你的类没有完全相关但在类中声明的函数,它不是一个方法; 这被称为糟糕的设计.
类上的方法作用于类的实例,称为对象.
class Example { public int data = 0; // Each instance of Example holds its internal data. This is a "field", or "member variable". public void UpdateData() // .. and manipulates it (This is a method by the way) { data = data + 1; } public void PrintData() // This is also a method { Console.WriteLine(data); } } class Program { public static void Main() { Example exampleObject1 = new Example(); Example exampleObject2 = new Example(); exampleObject1.UpdateData(); exampleObject1.UpdateData(); exampleObject2.UpdateData(); exampleObject1.PrintData(); // Prints "2" exampleObject2.PrintData(); // Prints "1" } }
在诸如Object Pascal或C++的OO语言中,"方法"是与对象相关联的函数.因此,例如,"狗"对象可能具有"树皮"功能,这将被视为"方法".相反,"StrLen"函数是独立的(它提供了作为参数提供的字符串的长度).因此它只是一个"功能".Javascript在技术上也是面向对象的,但与C++,C#或Pascal等全面语言相比,它面临着许多限制.尽管如此,这种区别仍然应该存在.
另外几个事实:C#完全面向对象,因此您无法创建独立的"函数".在C#中,每个函数都绑定到一个对象,因此从技术上讲,它是一种"方法".问题在于,C#中很少有人将它们称为"方法" - 它们只使用术语"功能",因为没有任何真正的区别.
最后 - 正如所有Pascal大师都不会在这里跳过我--Pascal还区分了"函数"(返回值)和"不返回值"的"程序".C#没有明确区分,尽管你可以选择返回一个值.
由于您提到了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
我使用greet_with_greeter
函数完全相同的方法(使用"点"语法来获取它,因为我在一个类中定义它):
Greeter.greet(hello_greeter, "World")
所以我有效地将一个方法变成了一个函数.我可以将函数转换为方法吗?好吧,因为Python允许你在定义后弄乱类,让我们试试:
Greeter.greet2 = greet_with_greeter hello_greeter.greet2("World")
是的,该功能greet_with_greeter
现在也称为方法greet2
.这显示了方法和函数之间唯一真正的区别:当你通过调用"on"对象调用方法时object.method(args)
,语言会神奇地将其转换为method(object, args)
.
(OO纯粹主义者可能认为一种方法与函数不同,如果你进入高级Python或Ruby - 或Smalltalk! - 你将开始看到他们的观点.另外一些语言给方法特殊访问对象的位.但是主要的概念差异仍然是隐藏的额外参数.)
对我来说:如果我同意,方法和功能的功能是相同的:
函数可以返回一个值
可能期望参数
就像任何一段代码一样,你可能有你放入的对象,你可能会有一个对象.在这样做的过程中,他们可能会改变对象的状态,但这不会改变他们的基本功能.
在调用对象或其他代码的函数时可能存在定义差异.但这不是口头上的差异,这就是人们交换它们的原因吗?提到计算的例子我会小心.因为我聘请雇员来做我的计算:
new Employer().calculateSum( 8, 8 );
通过这样做,我可以依靠雇主负责计算.如果他想要更多的钱,我就会解雇他,并让垃圾收集者处理未使用的员工的功能完成剩下的工作并获得新员工.
甚至认为方法是一个对象函数而一个函数是不相关的计算也无济于事.函数描述符本身,理想情况下函数的文档将告诉我它需要什么以及它可能返回什么.其余的,就像操纵一些物体的状态对我来说并不是真的透明.我确实希望功能和方法能够提供和操纵他们声称的内容,而无需详细了解他们是如何做到的.即使是纯计算函数也可能会更改控制台的状态或附加到日志文件.