直观理解:
如果不加self,表示是类的一个属性(可以通过"类名.变量名"的方式引用);加了self,表示类的实例的一个属性(可以通过"实例名.变量名"的方式引用)。如:
class Test(object): val = 100 def __init__(self): self.val = 200 test = Test() test.val #输出200 Test.val #输出100
也可以从以下多角度理解self:
1、self名称不是必须的,在python中self不是关键词,你可以定义成a或b或其它名字都可以 ;
2、self在定义类的方法时必须位于第一个参数;
3、self总是指向调用时的类的实例;
4、self就是本身的意思,为了便于程序的,就得在类这个调用多个函数中,先申明自己是谁,到底是self,还是self. 所以必须有参数;
5、在调用时不必传入相应的参数;
每次实例化一个类时,都会先调用__init__()方法,相当于介绍你定义了个什么东西。
用__init__()方法定义了类,那么每个实例化后的对象就拥有自己的属性,可直接在实例化的时候指定参数,使用类的方法时,也不需要再去重复传参;而如果没有__init__(),直接用类的方法定义属性,则属性就属于类的,不属于对象自己的。并且在使用方法时需要指定参数。
geerniya有个解释特别好:
1. 不用__init__()方法定义类
1 class Rectangle(): 2 def getPeri(self,a,b): 3 return (a + b)*2 4 def getArea(self,a,b): 5 return a*b 6 7 rect = Rectangle() 8 print(rect.getPeri(3,4)) 9 print(rect.getArea(3,4)) 10 print(rect.__dict__)
输出结果为:
name: zhang, number: 34 {}
虽然不用__init__()方法也能正常实现要求,但查看这个实例的属性竟然是空的。在实例化对象的时候,student=Student()的参数是空的,只有在调用函数的时候才指定,并且类中定义的方法都有参数,明显不是很便捷。
class Student: def __init__(self,name,number): self.name=name self.number=number def student_info(self): print('name: {}, number: {}'.format(self.name,self.number)) student=Student('zhang',34) student.student_info() print(student.__dict__)
输出:
name: zhang, number: 34 {‘name’: ‘zhang’, ‘number’: 34}
这里可参考 https://blog.csdn.net/weixin_40650484/article/details/97391376 最后部分。