为什么在Python方法中需要显式地使用"self"参数?

222 投票
10 回答
108787 浏览
提问于 2025-04-11 09:17

在Python中,当你在一个类里定义一个方法时,代码大概是这样的:

class MyClass(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

但是在其他一些语言,比如C#,你可以用“this”这个关键词来引用与方法绑定的对象,而不需要在方法的定义里声明它作为一个参数。

那么,Python这样设计是故意的,还是有一些实现上的细节需要把“self”作为参数传递呢?

10 个回答

59

我建议大家去看看Guido van Rossum的博客,特别是这篇文章 - 为什么显式的self必须保留

当我们定义一个方法并加上装饰器时,我们无法确定是否应该自动给它一个'self'参数。因为这个装饰器可能会把这个方法变成一个静态方法(静态方法没有'self'),或者变成一个类方法(类方法的'self'指的是类而不是实例),也可能会做其他完全不同的事情(其实很简单就能写出一个装饰器,用纯Python实现'@classmethod'或'@staticmethod')。所以在不知道装饰器具体做什么的情况下,我们无法判断这个方法是否应该有一个隐含的'self'参数。

我不喜欢像特别处理'@classmethod'和'@staticmethod'这样的变通办法。

73

这样做是为了减少方法和函数之间的区别。它让你可以在元类中轻松生成方法,或者在运行时给已经存在的类添加方法。

比如:

>>> class C:
...     def foo(self):
...         print("Hi!")
...
>>>
>>> def bar(self):
...     print("Bork bork bork!")
...
>>>
>>> c = C()
>>> C.bar = bar
>>> c.bar()
Bork bork bork!
>>> c.foo()
Hi!
>>>

据我所知,这样做也让Python运行时的实现变得更简单。

97

我喜欢引用彼得的《Python之禅》中的一句话:“明确比隐含要好。”

在Java和C++中,'this.'可以根据上下文推断出来,除非你有一些变量名让它无法推断。所以有时候你需要用到它,有时候又不需要。

而Python选择让这些东西变得明确,而不是依赖某种规则。

另外,因为没有任何隐含或假设,所以实现的某些部分是可以直接看到的。像是self.__class__self.__dict__和其他一些“内部”结构都是很明显地可以使用的。

撰写回答