面向对象 -- 继承

2019-01-10  本文已影响0人  __深蓝__

继承,体现类的可扩展性,实现代码重用,相同的代码不需要重复编写

单继承
class 类名(父类名):
    pass
  • 子类可以继承父类,直接使用父类中的公有属性和方法
  • 子类不能直接访问父类的私有属性,只能通过父类的get/set方法访问
  • 子类可以增加特有的属性和方法
  • 父类的方法实现不能满足子类需求时,可以对方法进行重写(override)
  • 在子类中定义了一个和父类同名的方法并且实现,在运行时就会调用子类中重写的方法,而不会调用父类的方法
  • 因为Python中没有方法重载,所以重写时不存在父类方法重名问题
class Parent:        # 定义父类
   def myMethod(self):
      print ('调用父类方法')
 
class Child(Parent): # 定义子类
   def myMethod(self):
      print ('调用子类方法')
 
c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法

调用子类方法

在继承条件下,如果要调用父类的方法,可以使用super方法

super( ).__init__( 父类属性 )

子类对象的初始化属性原则是:

  • 子类新增的属性由子类初始化
  • 继承来的属性调用父类的__init__方法来初始化
class Base:
    def __init__(self, basename):
        self.basename = basename

class Sub(Base):
    def __init__(self, basename, subname):
        super().__init__(basename)  # 不能使用 super().basename = basename
        self.subname = subname
  • 在类使用super(子类名, self).父类方法名()的形式调用父类方法
  • 在类使用super(子类名, 子类对象).父类方法名()的形式调用父类方法
class Base:
    def base_func(self):
        print('base_func()')

class Sub(Base):
    pass

if __name__ == '__main__':
    s = Sub()
    super(Sub, s).base_func()

多继承

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

class 子类名( 父类名1, 父类名2 ... )
    pass
  • 如果多个父类存在同名的属性或方法,应该避免使用多继承
  • Python中提供了一个内置属性__mro__,用来查看方法的搜索顺序
  • MRO (method resolution order),用于判断多继承时方法、属性的调用顺序
  • 搜索时,是按照__mro__从左至右顺序查找,如果在当前类中找到方法,就直接执行,不再搜索
  • 如果没有找到,就查找下一个类中是否有对应的方法,如果找到就直接执行,不再搜索
  • 如果找到最后一个类,还没有找到方法,程序报错




- end -

上一篇 下一篇

猜你喜欢

热点阅读