Python 面向对象中的单继承、多继承

面向对象有三大特征:封装、继承、多态。

封装

封装是面向对象编程的一大特点,可以提高程序的安全性。

根据职责将属性和方法等细节都封装在一个抽象的类中。在方法内部对属性进行操作,在类对象的外部调用方法。这样子,就不需要关心内部的具体实现细节。

继承

比如说在生活中,子女继承父辈的财产,通过继承,子女拥有了父辈的所有财产。

而在编程中,使用继承可以提高代码的复用性,使得相同的代码不需要重复编写。

如果一个类没有继承任何类,则默认继承 object ,object 类是顶级类或基类。

通过继承,子类拥有父类的所有方法和属性。而在子类中,只需要封装自己特有的属性和方法即可。

语法格式:

# 定义一个父类
class 父类名:
    pass

# 定义一个子类,继承父类
class 子类名(父类名):
    pass

父类:被继承的类叫做父类,又叫基类。

子类:继承其他类的类叫做子类,又叫派生类。

图片[1]-Python 面向对象中的单继承、多继承-尤尤'blog

使用继承,子类天生就具有父类的 eat/drink/sleep 方法,不需要重复封装。

class Animal:  # 父类(基类)
    def eat(self):
        print('动物在吃东西')

    def drink(self):
        print('动物在喝水')

    def sleep(self):
        print('动物在睡觉')


# Pig类和Cat类拥有父类Animal所有的属性和方法
class Pig(Animal):  # Pig是Animal的子类(派生类),Animal是Pig的父类(基类),Pig类从Animal类继承(派生)
    def hobby(self):
        print('佩奇最喜欢跳泥坑')


class Cat(Animal):  # Cat是Animal的子类(派生类),Animal是Cat的父类(基类),Cat类从Animal类继承(派生)
    def bark(self):
        print('小猫喵喵叫……')


peppa = Pig()
peppa.eat()  # Pig继承自父类的eat方法
peppa.hobby()  # Pig特有的方法

Tom = Cat()
Tom.sleep()  # Cat继承自父类的方法
Tom.bark()  # Cat类特有的方法
图片[2]-Python 面向对象中的单继承、多继承-尤尤'blog

继承的传递性

子类拥有父类以及父类的 父类中封装的所有属性和方法。也就是允许多层继承。

例如:C 类继承自 B 类,B 类又继承自 A 类。

这时,C 类拥有 B 类和 A 类的所有属性和方法。

1、单继承

单继承就是子类只继承一个父类。

语法格式:

class 子类名(父类名):
    pass   # 如果子类不想添加其他的属性和方法,可以使用pass关键字

比如说一位大师从小学习武艺,天赋异禀,经过千锤百炼,形成了一套独有的武功秘笈。他不想自己辛苦创作的武功在自己归西后失传,于是决定收徒,他将自己毕生的武艺传给了自己的徒弟A(徒弟A继承了师傅所有的武艺,即子类拥有父类所有的属性方法)。

而他收的徒弟又在师傅传授的招式上,研究出了新的招式(这是徒弟,也就是子类特有的属性方法),而徒弟又收了新徒弟,新徒弟学会了师傅以及师祖的所有武艺(即子类拥有父类以及父类的父类中封装的所有属性和方法,这就是继承的传递性

class DaShi:    # 父类
    conduct = '无私奉献,天赋异禀'   # 属性
    def make(self):     # 方法
        print('创作《武功秘笈》')
class TuDi(DaShi):      # 子类
    def newMake(self):  # 子类特有的方法
        print('创出新招式')
class TuSun(TuDi):      # 子类
    pass

A = DaShi()
print('DaShi A:',A.conduct)
A.make()

# 子类具有父类所有的属性和方法
B = TuDi()
print('TuDi B:',B.conduct)
B.newMake()

# 继承的传递性:子类TuSun具有父类(newMake)以及父类的父类(conduct,make)中封装的所有方法和属性
C = TuSun()
print('TuSun C:',C.conduct)
C.make()
C.newMake()
图片[3]-Python 面向对象中的单继承、多继承-尤尤'blog

2、多继承

多继承就是子类拥有多个父类,即子类继承多个父类。那么子类就具有所有父类的属性和方法。就像孩子会继承父亲和母亲的特性。

在日常开发中,如果我们希望某个类既具有 A 类的属性和方法,又具有 B 类的属性和方法,可以使用多继承。

语法格式:

class 子类名(父类名1,父类名2……):
    pass   # 如果子类不想添加其他的属性和方法,可以使用pass关键字

比如说大师收的徒弟为了完成大师的遗愿,要将时间绝学武功发扬光大,于是徒弟找到了其他不愿武功失传的大师拜师(子类继承自多个父类),收集了各个大师的武功秘籍(子类拥有所有父类的方法和属性),将这些武功传承下去。

class DaShiA:
    def kongfuA(self):
        print('DaShiA:《降龙十八掌》')
class DaShiB:
    def kongfuB(self):
        print('DaShiB:《黯然销魂掌》')
class DaShiC:
    def kongfuC(self):
        print('DaShiC:《耕余剩技》')
class TuDi(DaShiA,DaShiB,DaShiC):
    pass

# 创建子类的对象
td = TuDi()
# 子类对象调用父类DaShiA的方法
td.kongfuA()
# 子类对象调用父类DaShiB的方法
td.kongfuB()
# 子类对象调用父类DaShiC的方法
td.kongfuC()
图片[4]-Python 面向对象中的单继承、多继承-尤尤'blog

它的继承关系如下图:

图片[5]-Python 面向对象中的单继承、多继承-尤尤'blog

注意:如果父类之间存在同名的属性或方法,应尽量避免使用多继承。因为这样很难直观的判断出这个方法是调用哪一个类中的。

多态:提高程序的可扩展性和可维护性。

不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容