Python面向对象编程(Object Oriented Programming,OOP)之继承(Inheritance)

概念

继承是指一个对象直接使用另一对象的属性和方法。

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。

Python中类的继承分为:单继承(Single Inheritance)和多继承(Multiple Inheritance)。

class ParentClassOne:  # 定义第一个父类
    pass


class ParentClassTwo:  # 定义第二个父类
    pass


class SubClassOne(ParentClassOne):  # 定义第一个子类继承一个父类
    pass


class SubClassTwo(ParentClassOne, ParentClassTwo):  # 定义第二个子类继承两个父类
    pass

查看继承

__bases__:查看所有继承的父类。如

class ParentClassOne:  # 定义第一个父类
    pass


class ParentClassTwo:  # 定义第二个父类
    pass


class SubClassOne(ParentClassOne):  # 定义第一个子类继承一个父类
    pass


class SubClassTwo(ParentClassOne, ParentClassTwo):  # 定义第二个子类继承两个父类
    pass


print(ParentClassOne.__bases__)
print(SubClassOne.__bases__)
print(SubClassTwo.__bases__)

结果:

(<class 'object'>,)
(<class '__main__.ParentClassOne'>,)
(<class '__main__.ParentClassOne'>, <class '__main__.ParentClassTwo'>)

Process finished with exit code 0

提示:如果没有提示基类,Python的类会默认继承object类,object是所有Python的基类,它能提供一些常见的方法(如__str__等)。

继承的重要性

例:如果有两个类,猫和狗:

猫会做:爬树,吃,喝,拉撒

狗会做:看家,吃,喝,拉撒

如果我们想要分别为猫和狗创建类,那么你可能会这样做:

class Cat:
    def climb(self):
        print("猫爬树")

    def eat(self):
        pass

    def drink(self):
        pass

    def pee(self):
        pass


class Dog:
    def housekeeping(self):
        print("狗看家")

    def eat(self):
        pass

    def drink(self):
        pass

    def pee(self):
        pass

从上述代码不难看出,吃,喝,拉,撒是猫和狗共有的功能,而我们却分别的为猫和狗创建两次,这样未免过于复杂。我们可以使用继承的思想来避免重写这些代码,利用这个思想,你可以这样思考:

动物:吃,喝,拉撒

猫:看家(继承动物所有的功能)

狗:看门(继承动物所有的功能)

那么我们可以这样操作:

class Animal:
    def eat(self):
        pass

    def drink(self):
        pass

    def pee(self):
        pass


class Cat(Animal):
    def climb(self):
        print("猫爬树")


class Dog(Animal):
    def housekeeping(self):
        print("狗看家")

继承的方式就是在其子类后面键入括号,里面加上要继承的基类即可。下面我们演示继承的实现:

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

    def drink(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 climb(self):
        print("%s会爬树" % self.name)


class Dog(Animal):
    def __init__(self, name):
        self.name = name
        self.breed = "狗"

    def housekeeping(self):
        print("%s会看家" % self.name)


cat = Cat("小喵喵")
cat.eat()
cat.drink()
cat.pee()
cat.climb()
dog = Dog("小狗狗")
dog.eat()
dog.drink()
dog.pee()
dog.housekeeping()

结果:

小喵喵吃
小喵喵喝
小喵喵拉撒
小喵喵会爬树
小狗狗吃
小狗狗喝
小狗狗拉撒
小狗狗会看家

Process finished with exit code 0

以上演示的是单继承,那么多继承我们要怎么处理呢?要知道,Java和C#等语言只能继承一个类,但是Python允许多继承,其继承的方法有两种,分为深度优先广度优先

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

经典类和新式类:

经典类:当前类或者父类没有直接继承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()
a.bar()

结果:

A.bar

Process finished with exit code 0

分析:在执行bar()方法时,首先先去A类中查找,如果A中没有,就去B类中查找,如果B类没有,就去D类查找,如果D类没有,就去C类查找。

查找顺序:A——>B——>D——>C。

一旦找到,程序立刻中断,若是没有找到,报错。

新式类:当前类或者父类直接继承object类。如:

下列演示新式类实例:

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()
a.bar()

结果:

A.bar

Process finished with exit code 0

分析:在执行bar()方法时,首先先去A类中查找,如果A中没有,就去B类中查找,如果B类没有,就去C类查找,如果C类没有,就去D类查找。

查找顺序:A——>B——>C——>D。

一旦找到,程序立刻中断,若是没有找到,报错。

猜你喜欢

转载自blog.csdn.net/qq_33567641/article/details/81201579
今日推荐