我解释一下python的类方法为什么要写一个self参数

2025-01-21 12:20:27
推荐回答(3个)
回答1:

类(class)初始化之后会得到实例(instance)。
self就是用于代表初始化的到的实例。
明确地写一个self参数,使得类的方法(method)和普通的函数(function)本质上没有差异,所有的输入参数都显示地传递到方法/函数当中。
当然作为类的方法,作用的对象一定会是实例,因而在Python的设计之初,完全可以设计成self不作为一个参数,但是那样就需要一个关键字代表实例,比如在javascript中就是this。
然而Python的哲学是"Explicit is better than implicit.",显示要比隐示好,因此Python类的方法需要一个self参数代表实例是符合逻辑的。

回答2:

self 表示类实例自身,相当于C++中的this
在类中用self可以引用类实例的成员,方法

class test:
def printhello(self):
print("hello")
def output(self):
self.printhello()
output中就使用self调用了类本身的printhello方法

回答3:

这是对前面一个php程序员问python方法为什么要手写一个self的回答,当时那个帖非常的热闹,但是下面没有一个回复讲到要点,等我有空,已经找不到原帖了。

原因有多重。首先是python中几乎所有的东西的一级对象(一级对象的定义),method也不例外,比如你写一个:
class X:
def f(self, a, b):
...
那么可以这样引用f:
X.__dict__['f']
或者
X.f.__func__

现在问题来了,得到f以后怎么调用?f是一个方法,方法必须作用于对象。如果x是一个X对象,我们可以x.f(...),但是如果是以上面的方式得到的f呢?怎么f让作用于某个对象?最直观的方法就是和参数一起传递进去。

当然的限不同的设计也可以满足上面制。比如不要手写的self参数,增加this关键字,增加一个调用f个格式。这样的设计和pep20第二条不符合。

为理解python的self,不妨对比一下ruby和javascript。ruby的方式是方法不是一级对象,所以绕过了这个问题。javascript没有类,方法在调用时this会绑定到方法所属的对象,函数调用时this绑定到window,函数做构造器调用时this绑定到新对象。这么多规则,比Python复杂。