构造函数
__init__初学者看着很吓人,其实它就是一个初始化方法,只是命名为__init__。然而,构造函数不同于普通方法的地方就在于,将在对象创建后自动调用它们。
在Python中,创建构造函数很简单,只需要将方法init的名称从普通的init改成魔法版的__init__即可。如示例1
#示例1
>>> class My:
... def __init__(self):
... self.number = 45
...
>>> F = My()
>>> F.number
45
构造函数中也可以添加参数,由于参数是可选的,所有你也可以指定这个参数具体如示例2
#示例2
>>> class My:
... def __init__(self, value=45):
... self.number = value
...
>>> F = My()
>>> F.number
45
>>> F = My(" this")
>>> F.number
' this'
编写构造函数
现在,我们来创建一个实例来尝试编写一个构造函数。编写一个Person类。具体见示例3
>>> class Person:
... def __init__(self, name, job=None, pay=0):
... self.name = name
... self.job = job
... self.pay = pay
...
>>> bob = Person('Bob Smith')
>>> sue = Person('Sue Jones', job='dev', pay=10000)
>>> print(bob.name, bob.job, bob.pay)
Bob Smith None 0
>>> print(sue.name, sue.job, sue.pay)
Sue Jones dev 10000
#这里的bob对象针对job和pay接受了默认值,但是sue显式地提供了值。
#注意在创建sue时是如何使用关键字参数的
赋给实例属性第一个值的通常方法是,在__init__构造函数方法中将它们赋给self,构造函数方法包含每次创建一个实例的时候Python会自动运行代码。在OO术语中,self就是新创建的实例对象,而name, job, pay变成了状态信息,即保存在对象中供随后使用的描述性数据。
关于构造函数的疑惑解答
- 为什么类方法函数中的第一个参数特殊? 类方法中函中的第一个参数之所以特殊,是因为它总是接受将方法调用视为隐含主体的实例对象,按照惯例,通常称为self。因为方法函数默认总是有这个隐含的主体对象环境,所以我们说这是”面向对象“,也就是设计用来处理或修改对象的。
- __init__方法是做什么用的? 如果类中编写了或者继承了__init__方法,每次类实例创建时,Python会自动调用它。这也称为构造函数。除了明确传入类的名称的任何参数外,还会隐性的传入新实例。这也是最常见的运算符重载方法。如果没有__init__方法,实例刚创建时就是一个简单的空的命名空间。
- 怎么创建实例? 你可以调用类名称来创建类实例。任何传给类名称的参数都要出现在__init__构造函数中第二和其后的参数。新的实例会记得创建它的类,从而可以实现继承目的。