ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

子类初始化父类的二种方法

2021-03-08 22:04:25  阅读:236  来源: 互联网

标签:__ name 子类 self 二种 init 父类 age


类是面向对象编程中重要的概念,在大型项目中合理采用设计好的类,可以使系统逻辑更为清晰和健壮,在开发前期一般我们会设计一个或多个父类,设定好子类和父类的继承关系,其中很重要的就是父类初始化,所以今天我们来看看在子类中如何初始化父类和调用父类方法,只有了解了这些,你再看一些开源代码时才有头绪,否则双眼一抹黑,都不知道从哪里看起,对一些大型项目,理清他们类之间的关至关重要,其他不多说了,我们看具体实现方法:

第一种是在子类中显示的指定父类,调用父类的__init__()来初始化,我们看例子,现在我们有父类P,子类M,代码如下:

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()方法,所以在实例化后运行结果是:

myname is xiaoming,age is 12, salary is 1000


接下来我们用第二种方法,采用super()函数来对父类的初始化,还是上面的代码,我稍作修改,如下:

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函数,没特殊性,这篇就到这里


标签:__,name,子类,self,二种,init,父类,age
来源: https://blog.51cto.com/15060540/2651708

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有