本文旨在以最简单的角度叙述,一些情况并未列举。
首先,我们要知道一个类方法是服务于每一个实例化的实例。那从底层来讲,既然是服务于实例的,那实例肯定是要在类方法里面被操作,经过验证,在类方法中的参数self实际上就是这个实例本身。
可以用这样一个简单的方法验证:
class Car:
def print_info(self):
# 打印self
print(self)
# 实例化Car类并调用方法打印出类中的self
car = Car()
car.print_info()
# 打印出实例化的实例
print(car)
这样运行后结果是这样的:
<__main__.Car object at 0x7f77d07eb610>
<__main__.Car object at 0x7f77d07eb610>
Process finished with exit code 0
我们发现打印出来的两个内存地址都是一样的,全部指向Car object也就是Car类的实例。
另外,实际上这个参数的名字是可以自定义的,不过我们约定俗成都会写self,只要是类方法参数的第一个就是实例本身。
class Car:
def print_info(this):
# 打印this
print(this)
# 实例化Car类并调用方法打印出类中的this
car = Car()
car.print_info()
# 打印出实例化的实例
print(car)
结果仍然完全一致。
那么如果在类中要定义并使用跟实例没有关系的静态方法呢?用到@staticmethod即可,第一个参数不再是实例,即使你写的仍然是self。
class Car:
def print_info(self):
# 打印self
print(self)
@ staticmethod
def print_info_2(self):
print(self)
# 实例化Car类并调用静态方法
car = Car()
car.print_info_2('第一个形参需要被穿参,否则报错')
# 打印出实例化的实例
print(car)
运行结果:
第一个形参需要被穿参,否则报错
<__main__.Car object at 0x7fa62097b610>
Process finished with exit code 0
总结下来,self就是这个实例本身,包括一些其他魔术方法比如__init__等都同理,名称也不固定,类方法的第一个形参即是。