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


当前回答

函数是执行特定任务的一组指令或过程。它可以用来将代码分割成易于理解的部分,这些部分也可以被调用或重用。

方法是可以对对象执行的操作。它也称为存储为对象财产的函数。

主要区别:函数不需要任何对象并且是独立的,而方法是一个函数,它与任何对象链接。

//firstName() is the function

function firstName(){
 cosole.log('John');
}

firstName() //Invoked without any object

const person = {
  firstName: "John",
  lastName: "Doe",
  id: 5566,
};

//person.name is the method
person.name = function() {
  return this.firstName + " " + this.lastName;
};

document.getElementById("demo").innerHTML =
"My father is " + person.name() //performs action on object; 

其他回答

只需两个字:非静态(“instance”)方法将一个隐藏指针指向“this”(作为其第一个参数),该对象就是您调用该方法的对象。

这是与常规独立函数的唯一区别,尽管是动态调度。

如果您感兴趣,请阅读以下详细信息。

我将尽量简短,并将使用C++作为示例,尽管我所说的几乎可以应用于每种语言。

对于您的CPU来说,函数和方法都只是一段代码。时期因此,当调用函数/方法时参数

好吧,我说过没有实际的区别。让我们再深入一点:

有两种类型的方法:静态和非静态静态方法类似于常规函数,但在类内部声明,该类的作用仅类似于命名空间非静态(“instance”)方法采用指向“this”的隐藏指针。这是与常规独立函数的唯一区别。

撇开动态调度不谈,这意味着它非常简单:

class User {
    public string name; // I made it public intentionally

    // Each instance method takes a hidden reference to "this"
    public void printName(/*User & this*/) {
        cout << this.name << endl;
    }
};

相当于

public getName(User & user) {
    // No syntactic sugar, passing a reference explicitly
    cout << user.name << endl;
}

因此,本质上,user->printName()只是getName(user)的语法糖。

如果不使用动态调度,仅此而已。如果使用了它,那么它就有点复杂了,但是编译器仍然会发出一个看起来像函数的东西,将其作为第一个参数。

在OO世界中,这两个词通常用来表示同一件事。

从纯数学和CS的角度来看,当使用相同的参数(f(x,y)=(x+y))调用函数时,函数将始终返回相同的结果。另一方面,方法通常与类的实例相关联。尽管如此,大多数现代OO语言在很大程度上不再使用术语“函数”。许多静态方法可以很像函数,因为它们通常没有状态(不总是真的)。

方法和函数之间有什么区别?

Python的官方文档是这样定义的(感谢@Kelly Bundy!):

作用向调用者返回某个值的一系列语句。它还可以传递零个或多个参数,这些参数可以在主体的执行中使用。另请参阅参数、方法和函数定义部分

方法在类主体内定义的函数。如果作为该类实例的属性调用,该方法将获取实例对象作为其第一个参数(通常称为self)。请参见函数和嵌套范围。


正方形是矩形,但并非所有矩形都是正方形。我解释世界的方式是,一个方法是一个函数,但并不是所有的函数都是方法。方法之所以独特,是因为它是一种特殊类型的函数,它也与类关联,并且可以访问类成员变量。

另请参见:

hasattr被称为方法,但它看起来像函数

IMHO的人只是想发明一个新词,当他们想引用对象内部的函数时,可以更方便地在程序员之间进行交流。

如果你说的是方法,你指的是类内的函数。如果你说的是函数,那么你的意思只是类之外的函数。

事实上,这两个词都用来描述函数。即使你用错了,也不会发生任何错误。这两个词都很好地描述了您希望在代码中实现的目标。

函数是一个代码,它必须扮演一个做某事的角色(一个函数)。方法是解决问题的方法。

它也做同样的事情。这是同样的事情。如果你想超精确并遵循惯例,你可以调用方法作为对象内部的函数。

面向对象范例背后的思想是“处理”软件由。。好的“对象”。现实世界中的对象具有财产,例如,如果您有一个Employee,则该员工具有姓名、员工id、职位、他属于某个部门等。

对象还知道如何处理其属性并对其执行一些操作。比方说,如果我们想知道员工现在在做什么,我们会问他。

employe whatAreYouDoing.

“whatAreYouDoing”是发送给对象的“消息”。对象知道如何回答这些问题,据说它有解决问题的“方法”。

因此,对象必须公开其行为的方式称为方法。因此,方法是工件对象必须“做”的事情。

其他可能的方法有

employee whatIsYourName
employee whatIsYourDepartmentsName

etc.

另一方面,函数是编程语言计算某些数据的方式,例如,您可以使用返回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;
}

说一个对象有一个“函数”来执行某些操作是不“自然”的,因为函数更多地与数学相关,而雇员几乎没有数学知识,但你可以有与函数完全相同的方法,例如在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有一种“自然语言”matphor的概念,在某种程度上OO也有这种想法。例如Smalltalk。我希望在阅读了这篇文章之后,您可以更容易地理解对象中的方法。

注意:代码不是要编译的,只是作为示例。请随意修改文章并添加Python示例。