为什么 class 方法必须在 python 中有 self 参数?

Why class method must have self parameter in python?

class Student:
    def __init__(self, name):
        self.name = name

我知道这段代码为什么用self了。这可以让不同的学生产生不同的属性

student1 = Student()
student2 = Student()
...
studentn = Student()
------------------------------------

student1.name
student2.name
...
studentn.name

但我不明白为什么下面这段代码需要 self 参数。

class Student:
    def study():
        print("I'm studying")


Student().study()

输出

Traceback (most recent call last):
  File "C:/directory/test.py", line 12, in <module>
    Student().study()
TypeError: study() takes 0 positional arguments but 1 was given

在 class 中创建函数时,您需要将 self 作为参数传递:

class Student:
    def study(self):
        print("I'm studying")

The first argument of every class method, including init, is always a reference to the current instance of the class. By convention, this argument is always named self. In the init method, self refers to the newly created object; in other class methods, it refers to the instance whose method was called

更多关于自变量的信息here

因为方法是通过调用它们的实例传递的,无论该方法是否需要它。

如果您不想使用参数,请将其设置为 "static method":

class Student:
    @staticmethod
    def study():
        print("I'm studying")

这就是 python 在您执行 instance.method() 时的工作方式。方法接收实例作为第一个参数。注意: Student().study() 等同于

student = Student()
student.study()

如果不加'self'

可以使用这段代码
class Student:
    def study():
        print("I'm studying")


Student.study()

输出: 我在学习

Self 不是关键字,它只是一个约定。此外,当您将 self 传递给 class 的方法时,您是通过使用 self 来引用该特定对象(因为 class 可以有多个对象并且都可以访问该方法),self 给您通过使用 self.att 在该方法中使用 class 的属性的选项。您可以将函数研究的输出作为 self.study="I am studying" 之类的属性,这将更适合您的目的。您可以阅读更多 and here .

Guido Van Rossum(python 的制作者)写了一篇博文,其中他告诉 why explicit self has to stay.

原因是因为每当在对象上调用方法时,Python 会自动将方法传递给调用它的对象。