第一个问题,init
在定义一个类时,什么时候用__init__函数,什么时候不用,用不用有什么区别?
首先__init__是为了初始化用的,但是初始化的时候不一定要用这个,直接定义也是可以的,比如
class A(object):
test_a = '123'
而我们用__init__的好处在于可以接受任何参数并初始化
def __init__(self,a):
test_a = a
这样类可以初始化一个动态的变量,更加灵活,直接test(‘123’)就将test_a初始化成123了
再举一个例子,如下
# 不用init方法定义类
class Rectangle(object):
def getPeri(self,a,b):
return (a+b)*2
def getArea(self,a,b):
return a*b
rec = Rectangle()
print(rec.getPeri(3,4)) # 14
print(rec.getArea(3,4)) # 12
print(rec.__dict__) # {}
从上例可以看到,没有定义__init__方法,也能得到周长和面积,但是通过rec.__dict__来看这个实例的属性,是空的,这就是没有定义__init__的原因。
并且,在实例化对象时,rec=Rectangle()参数为空,没有指定a,b的值,只有在调用函数的时候才指定,且类中定义的每个方法的参数都有a,b,有点多余了。
因此,需要在类中定义__init__方法,方便创建实例的时候,需要给实例绑定上属性,也方便类中的方法定义。
上述同样的例子,用__init__方法定义类,如下
# 使用__init__方法定义类
class Rectangle(object):
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
rec = Rectangle(3,4)
print(rec.getPeri()) # 14
print(rec.getArea()) # 12
print(rec.__dict__) # {'a': 3, 'b': 4}
定义完init()方法后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。