目标:

  • 单继承
  • 多继承

面向对象三大特性:

  • 封装:根据职责将属性和方法 封装到一个抽象的类中
  • 继承:实现代码的重用,相同的代码不需要重复的编写
  • 多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度。

01 单继承

  • 继承的概念:子类拥有父类的所有方法和属性
  • 继承的语法:class 类名(父类名):
  • 子类继承自父类,可以直接享受 父类中已经封装好的方法,不需要再次开发
  • 子类中应该根据职责,封装子类特有的属性和方法。
    专业术语:子类(派生类)、父类(基类)、继承(派生)
  • 继承的传递性:C类从B类继承,B类又从A类继承,那么C类就拥有B类和A类的所有属性和方法。

02 方法的重写

  • 应用场景:当父类的方法实现 不能满足子类需求时,可以对方法进行重写(override)
  • 重写父类方法有两种情况:1、覆盖父类方法;2、对父类方法进行扩展
  • 1、覆盖父类方法(当父类的方法实现和子类的方法实现完全不同时):在子类中重新编写父类的方法,具体的实现方式,就相当于在子类中定义了一个和父类同名的方法并且实现。重写之后,在运行时,只会调用在子类中重写的方法,而不会再调用 父类封装的方法。
  • 2、对父类的方法进行扩展(当 父类原本封装的方法实现是子类方法的一部分时):在子类中重新编写父类方法在需要的位置使用 super().父类方法 来调用父类方法的执行。代码的其他位置针对子类的需求,编写子类特有的代码实现。
    关于 super:在python中super 是一个特殊的类。super()就是使用super类创建出来的对象

03 父类的私有属性和私有方法

  • 子类对象 不能在自己的方法内部,直接 访问父类的私有属性或方法。

  • 子类对象 可以通过父类的公有方法,间接 访问到私有属性或私有方法。

  • 私有属性、方法 是对象的隐私,不对外公开,外界以及子类都不能直接访问。

  • 私有属性、方法通常用于做一些内部的事情。

class A:
    def __init__(self):
        self.num1 = 100
        self.__num2 = 200
    def __test(self):
        print("私有方法 %d %d" % (self.num1,self.__num2))
    def test(self):
        print("父类的公有方法 %d" % self.__num2)
        self.__test()


class B(A):
    def demo(self):
        self.test()

b = B()
print(b)
b.demo()

04 多继承

  • 概念:子类可以拥有多个父类,并且具有 所有父类的 属性和方法。
  • 语法:class 子类名(父类名1,父类名2...):
    注意事项:如果不同的父类中存在同名的方法,子类对象在调用方法时,会调用哪一个方法?MRO
    开发时,如果父类之间存在同名的属性或者方法,应该尽量避免使用多继承。

05 新式类与旧式类(经典类)

  • 新式类是以object为基类的类,经典类不以object为基类。
  • 在python3.x中定义类时,如果没有指定父类,会默认使用object类作为该类的基类,因此python3.x中定义的类都是新式类。但在python2.x中定义类时,如果没有指定父类,则不会以object作为基类。
  • 新式类和经典类的不同:1、object类提供一些内置的属性和方法(可以使用dir函数查看)2、新式类和经典类在多继承时对方法有不同的搜索顺序。
  • 注意:为了保证编写的代码能够同时在 python2.x和python3.x中运行,建议今后在定义类时,如果没有父类,建议统一继承自object
  • class 类名(object):