用到__init__函数(方法),
首先,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问。
而__init__函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量)。
__init__函数(方法)的第一个参数必须为self,后续参数为自己定义。
普通函数(方法)来实现一个Box类,有width, height, depth三个属性,以及计算体积:
#!/usr/bin/python
# -*- coding utf-8 -*-
#Created by Lu Zhan
class Box:
def setDimension(self, width, height, depth):
self.width = width
self.height = height
self.depth = depth
def getVolume(self):
return self.width * self.height * self.depth
b = Box()
b.setDimension(10, 20, 30) // 成员函数需要被手动调用
print(b.getVolume())
__init__()方法(函数)又被称为构造器(constructor)或构造函数
用__init__()这个特殊的方法(函数)可以方便地自己对类的属性进行定义
定义完init()方法后,创建的每个实例都有自己的属性,也方便直接调用类中的函数
成员函数需要被手动调用,而构造函数在创建对象的过程中是自动被调用的
#!/usr/bin/python
# -*- coding utf-8 -*-
#Created by Lu Zhan
class Box:
def __init__(self, width, height, depth): // 这里的init函数就相当于跟类同名的函数,即指代类Box本身实例化了一个具体的Box
self.width = width
self.height = height
self.depth = depth
def getVolume(self):
return self.width * self.height * self.depth
b = Box(10, 20, 30) // 构造函数在创建对象的过程中是自动被调用的,
print(b.getVolume())
一般情况下,在一个类中,包含构造函数和成员函数,在构造函数中,定义了成员变量并给成员变量赋值。构造函数的形参与成员变量有关.
构造函数和成员函数之间的区别:
成员函数的函数名可以自定义,但是, python构造函数的函数名是固定的__init__
对于同一个对象而言,成员函数可以被调用多次,但是,构造函数只能被调用一次
为什么一定要定义init()方法,定义完init()方法后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。。
1、不用init()方法定义类
定义一个矩形的类,目的是求周长和面积。
class Rectangle():
def getPeri(self,a,b):
return (a + b)*2
def getArea(self,a,b):
return a*brect = Rectangle( )
print( rect.getPeri(3,4) ) // 调用类方法
print( rect.getArea(3,4) )
print(rect.__dict__)
得到结果:
14
12
{}
从上例中可以看到,我们在类中并没有定义init()方法,但是也能够得到类似的要求,结果返回了矩形实例rect的周长及面积。
但是,我们通过print(rect.dict)来看这个实例的属性,竟然是空的。
(dict是字典 dictionary 的缩写,这个方法也是类中定义的魔术方法,作用应该是把类中的私有属性装在一个字典里面返回出来)。
我定义了一个矩形,按理来说它的属性应该是它的长、宽。但是它竟然没有。这就是没有定义init()的原因了。
并且,在实例化对象的时候,rect = Rectangle()参数为空,没有指定a、b的值,只有在调用函数的时候才指定了。且类中定义的每个方法的参数都有a、b,这显然浪费感情,在类中直接指定方法就可以了。、
因此吧,需要在类中定义init()方法,方便创建实例的时候,需要给实例绑定上属性,也方便类中的方法(函数)的定义。
2、用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.brect = Rectangle(3,4)
print( rect.getPeri() )
print( rect.getArea() )
print(rect.__dict__)
得到结果:
14
12
{'a': 3, 'b': 4}
定义完init() 后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。
构造函数也被称为构造器,当创建对象的时候第一个被自动调用的函数,系统默认提供了一个无参的构造函数 per = Person()
语法:
def __ init__(self,arg1,arg2,...):
函数体
说明:之前的写法中并没有显式的定义一个个构造函数,所以系统默认提供了一个无参的构造函数
arg1,arg2,...可以自己定义,但是,一般情况下,构造函数的形参列表和成员变量有关。
构造函数的特点:创建对象;给对象的成员变量赋值