7.7 魔术方法
Python 的类中存在一些方法,被称为"魔术方法",init() 就是其中之一。
__init() 的神奇之处就在于,如果你在类里定义了它,在创建实例的时候它就能帮你自动地处理很多事情——比如新增实例属性。在上面的代码中,我们创建了一个实例属性,但那是在定义完类之后再做的,这次我们一步到位:
class CocaCola():
formula = ['caffeine','sugar','water','soda']
def init(self):
self.local_logo = '可口可乐'
def drink(self): # HERE!
print('Energy!')
coke = CocaCola()
print(coke.local_logo)
运行结果:
>>> 可口可乐
其实init()是 initialize(初始化)的缩写,这也就意味着即使我们在创建实例的时候不去引用 init()方法,其中的命令也会先被自动地执行。是不是感觉像变魔术一样?
init() 方法可以给类的使用提供极大的灵活性。试试看下面的代码会发生什么:
class CocaCola:
formula = ['caffeine','sugar','water','soda']
def init(self):
for element in self.formula:
print('Coke has {}!'.format(element))
def drink(self):
print('Energy!')
coke = CocaCola()
除了必写的self 参数之外,init() 同样可以有自己的参数,同时也不需要这样obj.init()的方式来调用(因为是自动执行),而是在实例化的时候往类后面的括号中放进参数,相应的所有参数都会传递到这个特殊的 init() 方法中,和函数的参数的用法完全相同。
class CocaCola:
formula = ['caffeine','sugar','water','soda']
def init(self,logo_name):
self.local_logo = logo_name
def drink(self):
print('Energy!')
coke = CocaCola('可口可乐')
coke.local_logo
运行结果:
>>> 可口可乐
如果你对上面代码中的 self.local_logo = logo_name 感到不理解,我们在这里可以简单地解释一下。左边是变量作为类的属性,右边是传入的这个参数作为变量,也就是说这个变量的赋值所储存的结果将取决于初始化的时候所传进来的参数 logo_name,传进来什么那么它就将是什么。
