当前位置:首页 > 编程教程 > Python教程 > python继承与派生

python继承与派生
栏目分类:Python教程发布日期:2020-01-18浏览次数:

继承与派生 1.继承与派生的概念 请思考这样的一个应用场景:在一个大项目中,将要实现的一个功能写成一个类的形式,然后创建多个对象使用,但是忽然有一处在创建对象时需要这个类在保留原有功能的前提下,增加一点内容,这时我们不能修改原类,但又有必须增
继承与派生

1.继承与派生的概念

请思考这样的一个应用场景:在一个大项目中,将要实现的一个功能写成一个类的形式,然后创建多个对象使用,但是忽然有一处在创建对象时需要这个类在保留原有功能的前提下,增加一点内容,这时我们不能修改原类,但又有必须增加内容,此时应该怎么办?
当然,我们可以新建一个类,然后将之前的类在新类里面复现,再增加新的内容,可是如此的话,会有大量的重复代码出现在我们的程序里,增加了许多不必要的麻烦。
为此,面向对象程序设计中提供了“继承”这一技术,帮助我们解决“代码复用”。其中原有的类,称为“父类或基类”,需要增加功能的类继承父类后可以使用父类的属性和方法,它们被成为“子类或派生类”。比如一个父类“食品类”,它的子类可以是“水果类”和“肉类”,“水果类”有可以派生苹果、香蕉等等,这些类中,它们即可以是上一代的子类,又可以是下一代的父类。

2.继承的语法

一个类想要继承另一个类的方式很简单,只需要在定义类时,在类名后面加一个小括号,在括号里写上要继承的类就可以了,而且python中允许多重继承,即一个类可以继承自多个类,格式如下:


在python中有一个类叫做”object”,当一个类没有继承时,它会默认继承自”object”类,也就是说,”object”类是所有类的父类,在”object”类中定义了许多所有类共有的默认实现,比如:__init__,__sizeof__等。


输出结果:
[<class '__main__.three'>, <class '__main__.one'>, <class '__main__.two'>, <class 'object'>]
我来自类one中的方法
我来自类two中的方法
 
上述例子中,先是定义了两个简单的类,然后第三个类继承自前两个类,可以看到第三个类中什么内容都没有,但是因为它继承了前两个类,所有它可以直接使用前两个类中的方法。其中第9行的mro()方法,作用是查看类的层次结构,通过打印,可以很清楚地看到类three的父类类别。假如,子类继承了多个父类,而父类中有重名的方法,调用时会优先选择继承父类列表中排在前面的父类中的方法,请大家自行修改上述程序验证。
 
如果是继承父类的实例属性,那么在子类的构造方法里往往调用父类的构造方法,来加载子类的实例对象,这不是必须的,我们也可以按照旧方式写,只不过这样可以体现继承的优势,如下例第7行代码。

也可以使用super()函数调用父类构造方法代替第7行,如:
super(teacher,self).__init__(name,age)
其中super()函数内的参数,一个是当前类名,一个是self,这两个可以省略,效果相同。supe()的作用就是调用父类中的一个方法。



输出结果:
我是person类中的name属性 小明
我是child类,是person类的派生类
hello 来自person类
我是child类,上面运行了我父类person中的out()方法
我是child类从父类中继承的name属性 小明
 
请读者亲自敲一遍,细细体会上述程序的执行顺序。
 
如果将类中的属性或方法私有化,那么它的派生类中不能直接使用该私有化的属性或方法,和我们上节一样,必须通过“对象名._类名__私有属性名”的方式间接调用。


该程序试图在派生类中输出父类的私有属性name,程序报错。删掉第7行,在创建对象后增加代码:print(a._person__name) 程序可以运行。
 
 

Cookie:

多重继承往往会导致类间关系复杂,应尽量避免。

相关热词: python

     
编程入门 编程教程 编程资源 编程问答