面向对象有3大特性:继承,多态,封装,本章介绍Python中的<强>继承>强特性~
什么是继承
继承是创建类的一种方式,在Python中支持多继承,即在创建类的时候可以继承一个或者多个父类。
在继承关系中,被继承的类通常称为父类(或超类,基类),新建的类则称为子类(或派生类)。
继承的优势在于可以<强>有效地重用代码,提高代码的可读性~ 强>
继承示例:
<代码>类Fu_1: #父类 通过 类Fu_2: #父类 通过 类Zi_1 (Fu_1): #单继承 通过 类Zi_2 (Fu_1 Fu_2): #多继承 通过代码>
上述示例中,Fu_1和Fu_2没有继承任何类,在Python3中,这样就会默认继承对象类,而在Python2中,默认不会继承对象类,注意区分~
可通过类的内置属性__bases__查看这个类继承的所有父类
<代码>打印(Zi_1.__bases__) 打印(Zi_2.__bases__) #输出结果: (& lt;类__main__.Fu_1的祝辞,) (& lt;类__main__.Fu_1的祝辞,& lt;类__main__.Fu_2的祝辞)代码>
重用与派生
重用
在开发过程中,若新建的一个类和已创建的另一个类属性及方法大致相同,则可以让新建的类(子类)继承已创建的类(父类),这样子类会继承父类的所有属性,包括数据属性和函数属性,实现了代码重用,代码变得简洁,可以有效缩短开发周期~
<代码>类父亲: def __init__(自我、名字、年龄): self.name=名字 自我。年龄=年龄 def(自我)说: 打印(喂!) 类的儿子(父亲): 通过 p=儿子(“婴儿”,19) p.say () #输出结果: 你好! 代码>
派生
在继承过程中,子类也可以添加或者重新定义这些属性,当父类和子类中有同名的属性时(包括数据属性和函数属性),会先调用子类中的属性(操作的是子类的实例化对象)
<代码>类父亲: 城市=白ⅰ? def __init__(自我、名字、年龄): self.name=名字 自我。年龄=年龄 def(自我)说: 打印('你好!' + self.city) 类的儿子(父亲): 城市=昂兆取? def(自我)说: 打印(“你好~”+ self.city) def吃(自我): 通过 p=儿子(“婴儿”,19) p.say () #输出结果: 你好~赫兹代码>
超级
在子类的函数中,若是要重用父类中某个函数的功能,可以直接通过超级来调用父类中的函数,当然也可以通过类名.func()来调用,只不过这样与调用普通函数无异。这个经常使用在需要对父类的同名方法进行扩展的场景~
<代码>类父亲: def(自我)说: 打印(喂!) def(自我介绍): 打印(父亲) 类的儿子(父亲): def(自我)说: super()请问() # Father.say(自我)#通过类名.func()、输出结果一致 打印(“你好~”) p=(儿子) p.say () #输出结果 你好! 你好~ 代码>
上述示例中,使用超级的时候省略了2个参数:儿子(当前类名称,注意不是父类),自我(当前对象)
<代码> super()请问() #等同于 超级(儿子,自我)请问()代码>
由于超级方法中已经默认传递了自我参数,所以后面的函数不需要再次传递自我~
注意:超级关键字只在新式类中有,Python3中所有的类都是新式类…
在子类的函数中使用超级方法,不一定仅调用同名的父类函数,也可以调用其他的父类函数~
<代码> def(自我)说: super () .introduce () 打印(“你好~”)代码>
如下示例中子类对父类的初始化方法进行了扩展,这是一种较为常用的使用方式~
<代码>类父亲: def __init__(自我、名字、年龄): self.name=名字 自我。年龄=年龄 def(自我)说: 打印(喂!) 类的儿子(父亲): def __init__(自我、姓名、年龄、爱好): 超级()。__init__(姓名、年龄) 自我。爱好=爱好 def(自我)说: super()请问() 打印(“你好~”)代码>
超级方法不光可以在类的内部使用,也可以在类的外部的使用,<强>在类的外部使用时,超级方法不可以省略参数强>
<代码> #外部使用超级 p=(儿子) 超级(儿子,p)请问() #输出结果: 你好!Python面向对象特性——继承