为什么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

我们可以看 javathis 部分,完全没有在参数里声明,但直接可以使用,这就是隐式;而反观 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 的用途,那么需要更多地去使用面向对象,届时就会明白它的好处!

相关文章

Python | 一文搞懂self

关于self在Python中,self是一个关键字,它表示类实例本身。通常,self是在类方法中的第一个参数传递的。通过使用self,我们可以访问类的属性和方法。当一个类定义后,我们可以使用它来创建对...

python self是什么鬼,其本质就是特殊的形参

小伙伴们能真正理解 self 是什么东西吗?现在我从实质上为小伙伴们讲解一下 self。self 的实质是形参,现通过普通形参,来讲解特殊形参 self看基本概念的理解普通形参:通过 函数(参数) 方...

Python这个代码里面x=self是什么意思啊

大家好,我是Python进阶者。一、前言前几天在Python白银交流群【无敌劈叉小狗】问了一个Python基础的问题,问题如下:这个代码里面x=self是什么意思啊?self到底是个什么存在呢?感觉把...

Python super()函数:调用父类的构造方法

前面不止一次讲过,Python 中子类会继承父类所有的类属性和类方法。严格来说,类的构造方法其实就是实例方法,因此毫无疑问,父类的构造方法,子类同样会继承。但我们知道,Python 是一门支持多继承的...

一文带你解读JavaScript的引用类型和函数对象

前言相信做网站对JavaScript再熟悉不过了,它是一门脚本语言,不同于Python的是,它是一门浏览器脚本语言,而Python则是服务器脚本语言,我们不光要会Python,还要会JavaScrip...