python-子类如何调用父类的__init__方法

转载:python子类如何调用父类的__init__方法

版权声明:本文为CSDN博主「liuchunming033」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/liuchunming033/article/details/48498061

Python不会自动调用父类的constructor,你得亲自专门调用它。

有两种常用方法:

1父类名.__init__(self,参数) #注意名字是父类  
2super(子类名,self).__init__(参数) #注意名字是子类,而且init后是self之外的参数

第一种方法,这种初始化的方式书写上比较简单,也比较容易阅读,例如

 1# coding=utf-8
 2class Person(object):
 3    def __init__(self, name="jim"):
 4        self.name = name
 5        self.flag = False
 6        print "Person",self.name
 7
 8    def call(self):
 9        print self.flag,"name:",self.name
10        self.flag = not self.flag
11
12class Programmer(Person):
13    def __init__(self):
14        Person.__init__(self,"Dotjar")
15        print "Programmer"
16
17    def set_name(self,name):
18        self.name=name
19
20coder = Programmer()
21coder.call()
22coder.set_name("dotjar")
23coder.call()

该例子中,Programmer实例初始化的时候调用父类的__init__方法对flag属性进行初始化,初始化之后的属性值是False。注意,调用父类__init__方法的时候,传递的参数数量要与父类中的__init__保持一致。

程序运行结果是:

1Person Dotjar
2Programmer
3False name: Dotjar
4True name: dotjar

注意:运行的时候如果你的环境里有多个python解释器,一定要选对解释器了,否则有的时候可能会出错。运行程序的时候,最后打个断点debug一下,看看程序运行的步骤。

第二种方法,举个栗子:

 1# coding=utf-8
 2class Person(object):
 3    def __init__(self, flag=False, name="jim"):
 4        self.name = name
 5        self.flag = flag
 6        print "Person",self.name
 7
 8    def call(self):
 9        print self.flag,"name:",self.name
10        self.flag = not self.flag
11
12class Programmer(Person):
13    def __init__(self, flag = True, name="Dotjar",age = 19):
14        self.age = 19
15        super(Programmer,self).__init__(flag,name)
16        print "Programmer's age:",self.age
17
18    def set_name(self,name):
19        self.name=name
20
21coder = Programmer()
22coder.call()
23coder.set_name("dotjar")
24coder.call()

这个例子对第一个例子进行了修改,首先父类中的__init__方法带有2个初始化属性,flag和name。子类的__init__方法比父类的__init__方法多了一个age属性,这个age属性只能在子类的__init__方法中初始化(因为父类中没有嘛,调用父类的__init__只能初始化父类和子类共有的属性)。 程序的输出是:

1Person Dotjar
2Programmer's age: 19
3True name: Dotjar
4False name: dotjar