面向对象-继承

Posted fan-1994716

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象-继承相关的知识,希望对你有一定的参考价值。

继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

例如:

  猫可以:喵喵叫、吃、喝、拉、撒

  狗可以:汪汪叫、吃、喝、拉、撒

如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实现他们所有的功能,如下所示:

技术图片技术图片
技术图片
class 猫:

    def 喵喵叫(self):
        print ‘喵喵叫‘

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

class 狗:

    def 汪汪叫(self):
        print ‘喵喵叫‘

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

伪代码
技术图片
View Code

上述代码不难看出,吃、喝、拉、撒是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次。如果使用 继承 的思想,如下实现:

  动物:吃、喝、拉、撒

     猫:喵喵叫(猫继承动物的功能)

     狗:汪汪叫(狗继承动物的功能)

技术图片技术图片
技术图片
class 动物:

    def 吃(self):
        # do something

    def 喝(self):
        # do something

    def 拉(self):
        # do something

    def 撒(self):
        # do something

# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 猫(动物):

    def 喵喵叫(self):
        print ‘喵喵叫‘
        
# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
class 狗(动物):

    def 汪汪叫(self):
        print ‘喵喵叫‘

伪代码
技术图片
View Code
技术图片技术图片
技术图片
class Animal:

    def eat(self):
        print "%s 吃 " %self.name

    def drink(self):
        print "%s 喝 " %self.name

    def shit(self):
        print "%s 拉 " %self.name

    def pee(self):
        print "%s 撒 " %self.name


class Cat(Animal):

    def __init__(self, name):
        self.name = name
        self.breed = ‘猫‘

    def cry(self):
        print ‘喵喵叫‘

class Dog(Animal):
    
    def __init__(self, name):
        self.name = name
        self.breed = ‘狗‘
        
    def cry(self):
        print ‘汪汪叫‘
        

# ######### 执行 #########

c1 = Cat(‘小白家的小黑猫‘)
c1.eat()

c2 = Cat(‘小黑的小白猫‘)
c2.drink()

d1 = Dog(‘胖子家的小瘦狗‘)
d1.eat()

代码实例
技术图片
代码实例

所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。

技术图片

 

学习了继承的写法之后,我们用代码来是上述阿猫阿狗的功能:

技术图片技术图片
技术图片
class Animal:

    def eat(self):
        print "%s 吃 " %self.name

    def drink(self):
        print "%s 喝 " %self.name

    def shit(self):
        print "%s 拉 " %self.name

    def pee(self):
        print "%s 撒 " %self.name


class Cat(Animal):

    def __init__(self, name):
        self.name = name
        self.breed = ‘猫‘

    def cry(self):
        print ‘喵喵叫‘

class Dog(Animal):
    
    def __init__(self, name):
        self.name = name
        self.breed = ‘狗‘
        
    def cry(self):
        print ‘汪汪叫‘
        

# ######### 执行 #########

c1 = Cat(‘小白家的小黑猫‘)
c1.eat()

c2 = Cat(‘小黑的小白猫‘)
c2.drink()

d1 = Dog(‘胖子家的小瘦狗‘)
d1.eat()

代码实例
技术图片
代码实例

那么问题又来了,多继承呢?

  • 是否可以继承多个类
  • 如果继承的多个类每个类中都定了相同的函数,那么那一个会被使用呢?

1、Python的类可以继承多个类,Java和C#中则只能继承一个类

2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先

  下图中B、C类继承D类,A类继承B、C类。

技术图片

 

  • 当类是经典类时,多继承情况下,会按照深度优先方式查找
  • 当类是新式类时,多继承情况下,会按照广度优先方式查找

经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

技术图片 技术图片

技术图片技术图片class D:

    def bar(self):
        print ‘D.bar‘


class C(D):

    def bar(self):
        print ‘C.bar‘


class B(D):

    def bar(self):
        print ‘B.bar‘


class A(B, C):

    def bar(self):
        print ‘A.bar‘

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()

经典类多继承
技术图片技术图片class D(object):

    def bar(self):
        print ‘D.bar‘


class C(D):

    def bar(self):
        print ‘C.bar‘


class B(D):

    def bar(self):
        print ‘B.bar‘


class A(B, C):

    def bar(self):
        print ‘A.bar‘

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()

新式类多继承

经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错

新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错

注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了

以上是关于面向对象-继承的主要内容,如果未能解决你的问题,请参考以下文章

modem代码-面向对象(数据继承)

代码的认爹之路: 面向对象继承

python 面向对象专题:继承

python 面向对象专题:继承

C++作为面向对象语言的三个基本特征:封装,继承和————

Java面向对象继承