本文旨在从最简单的角度描述,有些情况没有列出。
首先,我们需要知道,一个类的方法是为每个实例服务的实例。从底层来看,既然是为实例服务的,那么实例必须在类方法中操作,经过验证,在类方法中参数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_第一个形参需要穿参,否则报错') # 打印实例化实例 print(car)
运行结果:
第一个形参需要穿参,否则会报错 <__main__.Car object at 0x7fa62097b610> Process finished with exit code 0
总结下来,self就是这个例子本身,包括其他一些魔法方法,比如__init__同样,名称也不固定,类方法的第一个形参是。