Python中 __init__函数以及参数self怎么理解和使用?
self和__init__的语法学过Python的都清楚,但是靠死记硬背来迫使自己理解并不是个好办法,今天就回过头来看看__init__函数以及参数self如何更灵活的理解和运用。
回顾一下:
class类包含:
- 类的属性:类中所涉及的变量 ;
- 类的方法:类中函数;
一、理解__init__函数(方法)
在Python中定义类经常会用到__init__函数(方法),但对__init__()方法的作用和意义却不是很理解。
init()方法有两个方面的重大意义:
① 在对象生命周期中初始化,每个对象必须正确初始化后才能正常工作。
② init()参数值可以有多种形式。
__init__有点像C#中的构造函数,在类实例创建后立即调用。
class Student:
def __init__(self,number):
self.number=number
def student_number(self):
print('number:',self.number)
student=Student(34)
student.student_number()
在这里,我们把__init__方法定义为有一个参数number和self,它创建一个新域number。
这个过程中,通过self.number=number将数据封装在类中,调用时直接时直接通过类Student进行调用。
1)用到__init__函数(方法)
两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问。
__init__函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量)。
init函数(方法)的第一个参数必须是self(self为习惯用法,约定俗成的东西),后面的参数则可以自由定义,和定义函数没有任何区别。
2)那为什么一定要定义init()方法呢?看一个示例:
不用init()方法定义类会怎样?
定义一个矩形的类,目的是求周长和面积;
class Rectangle():
def getPeri(self,a,b):
return (a + b)*2
def getArea(self,a,b):
return a*b
rect = Rectangle()
print(rect.getPeri(3,4))
print(rect.getArea(3,4))
print(rect.__dict__)
结果
14
12
{}
从上例中可以看到,我们在类中并没有定义init()方法,但是也能够得到类似的要求,结果返回了矩形实例rect的周长及面积。
但是,我们通过print(rect.dict)来看这个实例的属性,竟然是空的,我定义了一个矩形,按理来说它的属性应该是它的长、宽。
但是它竟然没有,这就是没有定义init()的原因了。
并且,在实例化对象的时候,rect = Rectangle()参数为空,没有指定a、b的值,只有在调用函数的时候才指定了。
且类中定义的每个方法的参数都有a、b,这显然浪费感情,在类中直接指定方法就可以了。
因此需要在类中定义init()方法,方便创建实例的时候,需要给实例绑定上属性,也方便类中的方法(函数)的定义。
用init()方法定义类
用上面的例子再做一遍
class Rectangle():
def __init__(self,a,b):
self.a = a
self.b = b
def getPeri(self):
return (self.a + self.b)*2
def getArea(self):
return self.a * self.b
rect = Rectangle(3,4)
print(rect.getPeri())
print(rect.getArea())
print(rect.__dict__)
结果
14
12
{'a': 3, 'b': 4}
从上面的结果可以看到定义完init()后,创建的每个实例都有自己的属性,可以直接调用类中的函数。