Python3基础:08_04_面向对象编程(OOP)——单继承和多继承

0.前言

  这篇博客主要介绍Python面向对象编程中的继承概念以及继承中的相关语法和注意事项。
下面附带一个加强对继承理解的实例:
02_Python3中对继承的认识



1.继承概念


1.1什么是继承?
  一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。实现代码的重用,使相同的代码不需要重复的编写。


1.2子类与父类关系:

  • 子类拥有父类的所有方法和属性。
  • 子类又称为是父类的派生类,父类称为子类的基类。
  • 子类只能调用父类的属性和方法,不能调用其他类的属性和方法。


2.单继承

2.1基本语法:
class 子类名(父类名):
  pass

例如:

# 创建动物父类
class Animal:
    def eat(self):
        print('[动物]吃东西!')


# Dog类继承Animal类
class Dog(Animal):
    def bark(self):
        print('[狗子]汪汪叫!')

# 创建Dog子类对象
laifu = Dog()
# 调用父类方法
laifu.eat()
# 调用自己的方法
laifu.bark()

运行结果:
[动物]吃东西!
[狗子]汪汪叫!

说明:

  • Dog类继承自Animal类,享有Animal类的所有方法
  • 子类可以调用父类的方法,父类不能调用子类的方法。


2.2继承的传递性
  C类继承了B类,B类又继承了A类,那么C累拥有B类和A类两个类中的所有属性和方法。

例如:

# 创建动物父类
class Animal:
    def eat(self):
        print('[动物]吃东西!')


# Dog类继承Animal类
class Dog(Animal):
    def bark(self):
        print('[狗子]汪汪叫!')


class FlyDog(Dog):
    def fly(self):
        print('[飞天狗]飞上天了!')


# 创建飞天狗的对象
fly_dog = FlyDog()
# 调用Animal类的方法
fly_dog.eat()
# 调用Dog类的方法
fly_dog.bark()
# 调用自身方法
fly_dog.fly()

运行结果:
[动物]吃东西!
[狗子]汪汪叫!
[飞天狗]飞上天了!

说明:
  FlyDog类继承了Dog类,Dog类继承了Animal类,所以FlyDog类创建的对象拥有Dog类和Animal类中的方法。


2.3方法重写
  父类中的方法不能满足子类需求时,可以在子类中对父类方法进行重写。分为父类方法覆盖和父类方法扩展。


2.3.1父类方法覆盖

语法:
class 父类名:
  def 父类方法1:
    pass
class 子类名(父类名):
  def 父类方法1:
    pass


例如:

# 创建动物父类
class Animal:
    def move(self):
        print('[动物]移动!')

    def eat(self):
        print('[动物]有福同享,一起吃!')


# Dog类继承Animal类
class Dog(Animal):
    # 重写父类方法
    def move(self):
        print('[狗子]四条腿跑!')

    def eat(self):
        print('[狗子]护食,一起玩可以,食物是自己的!')

    def bark(self):
        print('[狗子]汪汪叫!')


class FlyDog(Dog):
    def move(self):
        print('[飞天狗]飞上天了')


print('狗子对象:')
# 创建Dog对象
ordinary_dog = Dog()
# 调用重写方法
ordinary_dog.move()
print('-'*50)
print('飞天狗对象:')
# 创建飞天狗的对象
fly_dog = FlyDog()
# 调用重写方法
fly_dog.move()
# 调用父类重写方法
fly_dog.eat()

运行结果:
狗子对象:
[狗子]四条腿跑!
--------------------------------------------------
飞天狗对象:
[飞天狗]飞上天了
[狗子]护食,一起玩可以,食物是自己的!

说明:

  • 父类方法重写后对子类有影响。(如Dog类的对象ordinary_dog调用eat方法与FlyDog类的对象fly_dog调用eat是一样的。)
  • 子类对父类方法重写对父类没有影响。(如Dog对象调用move方法与FlyDog调用move方法的是有区别的。)

2.3.2父类方法扩展

基本语法:
class 父类名:
  def 父类方法1:
    pass
class 子类名(父类名):
  def 父类方法1:
    super.父类方法1()
    pass

例如:

# 创建动物父类
class Animal:
    def move(self):
        print('[动物]移动!')


# Dog类继承Animal类
class Dog(Animal):
    # 扩展父类方法
    def move(self):
        # 保留父类方法
        super().move()
        # Animal.move(self)
        # 扩展父类方法
        print('[狗子]四条腿跑!')


dog = Dog()
dog.move()

运行结果:
[动物]移动!
[狗子]四条腿跑!

说明:

  • Dog类方法move()在保留父类方法的前提下,对move()方法进行了扩展。
  • 扩展方法有两种:[super().父类方法名()]或者[父类名.父类方法名(self)],其中self是必须传入的参数。两种扩展方法中建议使用super().父类方法名(),两种方法不要混合使用。
  • super().父类方法()也是在子类方法中调用父类方法的一种形式,不一定运用于方法重写中。


3.多继承

  子类可以拥有多个父类,并且享有所有父类的所有属性和方法。

基本语法:
class 子类名(父类1,父类2,…):
  pass

例如:

class A:
    def text(self):
        print('A类方法')


class B:
    def demo(self):
        print('B类方法')


class C(A, B):
    pass


c = C()
c.text()
c.demo()

运行结果:
A类方法
B类方法

说明:
1.开发时,多个父类中,尽量不要使用同名方法。
2.若父类中出现了同名方法,则子类会调用继承位排序靠前的父类中的方法。



总结:
  * 继承可以提高代码的利用率,不需要编写大量重复的代码。
  * 子类创建的对象可以访问父类中所有的属性和调用父类中所有的方法。
  * 父类创建的对象不能访问子类中的属性和调用子类中的方法。
  * 子类中对父类中的方法进行重写或扩展后,对父类创建的对象没有影响,只会对子类创建的对象有影响。
  * 在子类内部需要调用父类方法时,应该用super().父类方法()语句来调用。



时间:2019年5月7日19:14:26


猜你喜欢

转载自blog.csdn.net/qq_44713454/article/details/89786452