python类杂谈,self 到底是什么

liftword4周前 (04-05)技术文章13

在python中,无论是在__init__方法,还是自定义的方法中,他们都必有第一个参数 self



初学者可能会对这个参数很迷惑,这个参数好像没啥用,毕竟又不需要传参,每次定义函数又必须写上,你可能会觉得很麻烦,而且很容易忘记写入

class Car:
	def __init__(self,name):
		self.name=name

	def say(self):
		print('this is a car name {self.name}')

self 是实例的身份标识

举个例子,如果按照图纸建造了许多房子,那么那些业主是怎么区分哪个房子是自己的呢?

很简单,建造完成之后,都会有门牌号或者说几栋几单元几层及门牌号之类的,房主买房子类似于初始化,房主买了哪个房子就和哪个门牌号进行了绑定,这样即使房子再多也不会走错啦。

self相当于一个身份标识,可以将类对象和函数进行对应的绑定,所以在调用同一个方法时,因为有self绑定而不会混乱。

简单来说,实现类对象和属性及方法的绑定。

class Test:
    def say(self):
        print(self)
        print(self.__class__)

t = Test()
t.say()

<__main__.test object at 0x0000015ea79ab890>   #类的实例

从上面的例子中可以很明显的看出,self代表的是类的实例。

self可以不写吗

如果我们在定义和传递时都不传递 self,是可以的,这个时候是类方法了

class Test:
    def say():
        print('hello')

Test.say()
输出:hello

如果不写self,变成了类方法是可以的,只能通过类调用。

但是如果我们试图在定义方法时不传入self 而使用类对象调用时,就会提醒我们需要多传递一个参数

class Test:
    def say():
        print('hello')
t = Test()
t.say()
#直接报错
TypeError: Test.say() takes 0 positional arguments but 1 was given

必须是 self 吗?

如果有一些童鞋学习过别的语言然后学习Python,可能总觉得 self 怪怪的,想写成java中的 this,可以吗?当然是可以的。

代码测试一下:

class Test:
    def say(this):
        print(this)
        print(this.__class__)

t = Test()
t.say()

<__main__.test object at 0x00000182ef2cb8d0>

改成this后,运行结果完全一样。

当然最好还是尊重约定俗成的习惯,使用self。

总结一下:

  • self 在定义时需要定义,在调用时会自动传入。
  • self 总是指调用时的类的实例。
  • self 的名字并不是规定死的,但是最好还是按照约定使用self。

相关文章

读懂python中的self

一、self的作用self指的是调用该函数的对象(是一个实例)。Python中self等价于Java中的this。首先明确的是self只有在类中的方法中才会有,独立的函数或方法是不必带有self的。例...

Python 中的 self 是啥?这是面试绕不过去的点!

说到面试 Python,self 绝对是“高频题”。别小看它,这玩意儿是面向对象编程里非常核心的概念。简单来说,self 就是方法绑定到实例的桥梁,用来指代“当前对象”。为啥离不开 self?你写类的...

Python类中的self到底是干啥的

Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上。后来对Python渐渐熟悉了一点,再回头看self的概念,似乎有点弄明白了。首先明确的是se...

揭秘:Python中的“self”

在在类方法中,可以通过一个特殊参数(按照惯例称为 self)来引用实例。self 始终是实例方法的第一个属性。下面介绍一下如何不仅可以与所有实例共享属性,还可以共享方法# oop/class.self...