为什么python的self参数必须显式声明?隐式this才是万恶之源
杂谈
python中存在 self 这个参数,记得有个朋友是写 java 的,当他看到python中的代码立刻明白了它的用途。
他问我:“为什么python中的 self不能像this一样,隐式声明多好,少写一个代码。”
起初我也回答不上来,确实 隐式 会更加方便,那为什么要显式写 self 呢?
一、隐式和显式
self和this 其实用途一致,都是代表当前实例,那有的朋友可能不太理解什么叫显式,什么叫隐式,我这里举个例子:
隐式
// java 隐式
class Person {
String name;
int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
显式
# python 显式
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
我们可以看 java 的 this 部分,完全没有在参数里声明,但直接可以使用,这就是隐式;而反观 pythpn的self,得在方法中写出这个参数才能使用。
二、self到底是什么?
为了更好说明显式的优势,有必要给一些不太了解 self 的朋友解释一下它的用途。
如果官方一点 self 是指向实例本身,可能很多朋友也不太好理解。
那如果白话一点,每个对象就是一个人,那么 self 翻译过来就是 那个人自己。
实例化说明
现在我们使用之前的 Person 来说明一下这些情况,如果我们声明一个 小王,self 就是像下面这样的情况。
那如果现在实例化为小李,那将是下面的情况了:
那我们平时因为用中文用的比较少,基本用的是英文,我们换成平常写的形式:
self 不是一个固定的变量,它的变量是类实例化时,实例出来的对象是什么,它就是什么。换句话说,self 就是实例对象的本身。
三、显式的好处
相比this更加明确
使用 this 的朋友肯定遇到过指向不明确的情况,这里一个 this 那边一个 this,有的是 闭包里的this,有的是 实例的this,有的是 lambda的this,各种 this 令人崩溃。
这个时候就能体现显式的好处了,只有 显式 填写的才有相应 self,不填写的就没有。
那有人可能问什么时候要填写?
在python中填写 self 的地方不是我们自己定的,基本都已经包含在语法里了,而且如果用 ide代码智能提示 的,它将会自动提示:
ide自动生成
完全无需操心,ide会自动生成,用就是了。
区分了函数和方法
很多人可能不太明白什么叫 函数和方法,其实挺好区分的:函数就是一组代码;方法就是对象的一组代码。
在其他隐式 this 的语言中,函数还是方法 在肉眼上看是区分不出来的,而在python中它们非常好区分。
# 请问下面哪个是函数?哪个是方法
def say_hello(self):
pass
def say_hello():
pass
其实很明显,带self的 就是方法,没有带self的 就是函数。
这有什么用途呢?用途非常大,在使用 猴子补丁 时,如果你看到下面的代码:
def change_method(self):
pass
a = A()
a.method = change_method
只需要一眼就能明白,这个方法是用来修改对象中的方法。
四、总结
对于卡卡而言,确实觉得python中显式 self 比 隐式 this 好用多了,作为全栈开发者,对此深有体会。
如果你不太明白 self 的用途,那么需要更多地去使用面向对象,届时就会明白它的好处!