Python中 __init__函数以及参数self怎么理解和使用?

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()后,创建的每个实例都有自己的属性,可以直接调用类中的函数。

猜你喜欢

转载自blog.csdn.net/z1521695011/article/details/131210172