Python入门-面向对象三大特性-继承

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

例如:

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

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

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

伪代码
 
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

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

  动物:吃、喝、拉、撒

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

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

伪代码
 
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 '喵喵叫'
代码实例
 
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的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先

python2版本都是深度优先,3版本是广度优先,可以使用mro()方法查看即可【使用算法为C3算法】

 

 

class D():
    name = "D"

class B(D):
    name = "B"

class C(D):
    name = "C"

class A(B,C):
    # name = "A"
    pass

a=A()
print(A.name)
print(a.name)
print(A.mro())
print(A.__mro__)
#[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>]

 多继承下的supper?

# 子类重写了,为啥还要调用父类:重用父类代码

class A:
    def __init__(self):
        print("A")

class B(A):
    def __init__(self):
        print("B")
        super().__init__() #重写了
class C(A):
    def __init__(self):
        print("C")
        super().__init__()  # 重写了

class D(B,C):
    def __init__(self):
        print("D")
        super().__init__()  # 重写了


if __name__ == '__main__':
    d=D()          #D-B-C-A:和下面mro的顺序一致
    print(D.mro()) #[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
 

 

posted @ 2021-08-20 09:34  zwx901323  阅读(82)  评论(0)    收藏  举报