番外篇:面向对象之构造函数
构造函数(__init__)
概念及特征:
- 主要工作是初始化
- 是一类特殊函数,在类实例化的时候第一个被调用(实例1)
- 子类如果定义了构造函数,则实例化时不再查找父类的构造函数;如果没有定义,则实例化时会查找父类的构造函数(实例2)
- 如果子类没有定义构造函数,父类定义的构造函数带参数,则构造对象时的参数应按父类参数构造(实例3)
实例1:
#构造函数语法
class Animal():
name = "fifteen"
def __init__(self): #构造函数
print("I am a dog")
dog = Animal() #此处没有输出,但是在实例化对象dog时自动调用了类Animal中的构造函数
结果:
I am a dog
实例2:
#继承中的构造函数
class Mammal(): #定义父类为一个哺乳动物类
def __init__(self):
print("I am a mammal")
class Reptile(Mammal): #定义子类为爬行动物类
pass
class Dog(Reptile): #定义子类Dog
def __init__(self):
print("I am a small dog")
class Cat(Reptile): #定义子类Cat
pass
s = Dog() #子类Dog中定义了构造函数,则在实例化时不再往上查找父类的构造函数
c = Cat() #子类Cat中没有定义构造函数,则在实例化是往上查找父类的构造函数
结果:
I am a small dog
I am a mammal
实例3:
#继承中的构造函数
class Mammal(): #定义父类为一个哺乳动物类
def __init__(self,name):
print("my name is {0}".format(name)) #此处父类的构造函数需要两个参数
class Reptile(Mammal): #定义子类为爬行动物类
pass
class Dog(Reptile): #定义子类Dog
def __init__(self):
print("I am a small dog")
class Cat(Reptile): #定义子类Cat
pass
s = Dog() #子类Dog中定义了构造函数,查找到了子类中的构造函数,参数匹配不报错
#c = Cat() #子类Cat中没有定义构造函数,则在实例化时往上查找父类的构造函数,此时构造函数需要两个参数,因此报错
#正确写法,给出两个参数:
c = Cat("fifteen")
结果:
I am a small dog
my name is fifteen