类是面向对象编程中重要的概念,在大型项目中合理采用设计好的类,可以使系统逻辑更为清晰和健壮,在开发前期一般我们会设计一个或多个父类,设定好子类和父类的关系,其中很重要的就是父类初始化,所以今天我们来看看在子类中如何初始化父类和调用父类方法,只有了解了这些,你再看一些开源代码时才有头绪,否则双眼一抹黑,都不知道从哪里看起,所以对一些大型项目,理清他们类之间的关至关重要,其他不多说了,我们看具体实现方法:
第一种是在子类中显示的指定父类,调用父类的__init__()来初始化,我们看例子,现在我们有父类P,子类M,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class P: def __init__(self, name, age): self.name = name self.age = age def getname(self): return self.name def getage(self): return self.age class M(P): def __init__(self, name, age, salary): P.__init__(self, name, age) self.salary = salary def getsalary(self): return self.salary if __name__ == '__main__': t = M('xiaoming',12,1000) print 'myname is %s,age is %s, salary is %s' %(t.getname(), t.getage(), t.getsalary()) |
这段代码中在子类M的__init__构造函数中显示调用父类P的__init__()方法来进行初始化,同时也继承了父类的getname()和getage()方法,所以在实例化后运行结果是:
1 |
myname is xiaoming,age is 12, salary is 1000 |
接下来我们用第二种方法,采用super()函数来对父类的初始化,还是上面的代码,我稍作修改,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class P(object): def __init__(self, name, age): self.name = name self.age = age def getname(self): return self.name def getage(self): return self.age class M(P,object): def __init__(self, name, age, salary): super(M,self).__init__(name,age) self.salary = salary def getsalary(self): return self.salary if __name__ == '__main__': t = M('xiaoming',12,1000) print 'myname is %s,age is %s, salary is %s' %(t.getname(), t.getage(), t.getsalary()) |
因为super函数只能用于新式类中,所以每个类都继承object类,在这段代码中我们用super(M,self).__init__(name,age),这句对父类进行了初始化,这段代码运行结果跟第一个例子是一样的,那有人可能就有疑问了,两种方法都可以,我应该采用哪种方法比较好,我的建议是采用super函数,因为这个函数比较先进,它是借鉴了其他语言的特性加到python中的,你不用给它指定父类的名称,它自己会寻找父类并进行继承,这个在多继承时非常有用,如果是单继承,你可以显示的调用父类的初始化方法,也可用super函数,没特殊性,这篇就到这里,有问题可以留言,同时欢迎转发,:)