定义初始化方法的格式是def __init__(self)
,是由init加左右两边的【双】下划线组成( initialize “初始化”的缩写)。
初始化方法的作用在于:当每个实例对象创建时,该方法内的代码无须调用就会自动运行。
# 阅读代码后直接运行
class Chinese:
def __init__(self):
print('很高兴遇见你,我是初始化方法')
person = Chinese()
是不是很神奇?我们只是创建了实例,还没有调用,初始化方法就自动执行了!
利用这个特性,在编写习惯上,我们会在初始化方法内部完成类属性的创建,为类属性设置初始值,这样类中的其他方法就能直接、随时调用。我们来看个例子:
class Chinese:
def __init__ (self):
self.mouth = 1 # self.不能丢
self.eye = 2
def body(self):
print('我有%s张嘴巴' % self.mouth)
print('我有%s只眼睛' % self.eye)
person = Chinese()
person.body()
除了设置固定常量,初始化方法同样可以接收其他参数,让传入的这些数据能作为属性在类的方法之间流转。我们再来看个例子:
class Chinese:
def __init__(self, name, birth, region):
self.name = name # self.name = '吴枫'
self.birth = birth # self.birth = '广东'
self.region = region # self.region = '深圳'
def born(self):
print(self.name + '出生在' + self.birth)
def live(self):
print(self.name + '居住在' + self.region)
person = Chinese('吴枫','广东','深圳') # 传入初始化方法的参数
person.born()
person.live()
先看14行:当初始化方法有多个参数的时候,在实例化的时候就要传入相应的值,这里'吴枫'传给参数name, '广东'传给birth,'深圳'传给region。
当实例person创建完成后,初始化方法会自动执行,此时第三行的self.name = name
就等价于self.name = '吴枫',以此类推。(self.name中的name可以换成其他名称,只是我们习惯上这么写)
如此一来,类的其他方法就能通过self.属性名
的形式调用传入的数据了。(还记得self是实例的替身吧)
我猜你可能会有这样的疑惑:不用初始化方法不是也能实现吗?写多个方法不是更麻烦吗?
确实可以,比如上述的代码,我们也可以这么写:
class Chinese:
def born(self, name, birthplace):
print(name + '出生在' + birthplace)
def live(self, name, region):
print(name + '居住在' + region)
person = Chinese()
person.born('吴枫','广东')
person.live('吴枫','深圳')
虽然代码量并没有减少,但我们可以看到使用初始化方法,至少我们不必重复传参,传入的数据还可以被多次调用,比如这里的'吴枫'。
class Chinese:
def __init__(self, name, birth, region):
self.name = name # self.name = '吴枫'
self.birth = birth # self.birth = '广东'
self.region = region # self.region = '深圳'
def born(self):
print(self.name + '出生在' + self.birth)
def live(self):
print(self.name + '居住在' + self.region)
person = Chinese('吴枫','广东','深圳') # 传入初始化方法的参数
person.born()
person.live()
随着我们想实现的功能愈发复杂,我们会在类内部编写很多的方法,如果我们需要传入的数据能在类中长久保存并能被随时调用,初始化方法就是一个不错的解决方案。
等你自己开始用类来写代码时,就会发现初始化方法又实在又好用。所以只要用到了类,一般都少不了它。