为什么在Python方法中需要显式地使用"self"参数?
在Python中,当你在一个类里定义一个方法时,代码大概是这样的:
class MyClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
但是在其他一些语言,比如C#,你可以用“this”这个关键词来引用与方法绑定的对象,而不需要在方法的定义里声明它作为一个参数。
那么,Python这样设计是故意的,还是有一些实现上的细节需要把“self”作为参数传递呢?
10 个回答
我建议大家去看看Guido van Rossum的博客,特别是这篇文章 - 为什么显式的self必须保留。
当我们定义一个方法并加上装饰器时,我们无法确定是否应该自动给它一个'self'参数。因为这个装饰器可能会把这个方法变成一个静态方法(静态方法没有'self'),或者变成一个类方法(类方法的'self'指的是类而不是实例),也可能会做其他完全不同的事情(其实很简单就能写出一个装饰器,用纯Python实现'@classmethod'或'@staticmethod')。所以在不知道装饰器具体做什么的情况下,我们无法判断这个方法是否应该有一个隐含的'self'参数。
我不喜欢像特别处理'@classmethod'和'@staticmethod'这样的变通办法。
这样做是为了减少方法和函数之间的区别。它让你可以在元类中轻松生成方法,或者在运行时给已经存在的类添加方法。
比如:
>>> 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运行时的实现变得更简单。
我喜欢引用彼得的《Python之禅》中的一句话:“明确比隐含要好。”
在Java和C++中,'this.
'可以根据上下文推断出来,除非你有一些变量名让它无法推断。所以有时候你需要用到它,有时候又不需要。
而Python选择让这些东西变得明确,而不是依赖某种规则。
另外,因为没有任何隐含或假设,所以实现的某些部分是可以直接看到的。像是self.__class__
、self.__dict__
和其他一些“内部”结构都是很明显地可以使用的。