一、简介

  1、继承是类下建新类的方式,父类可以称为基类或超类,新类可以称为子类或派生类,子类可以继承父类的属性。

  2、父类可以被多个子类继承,子类亦可以继承多个父类。

  3、在python3中,最高祖类默认继承了内置的object类。

  4、在python2中,最高祖类没有默认继承,此时,该类及其子孙类都是经典类。除非明确最高祖类的父类为内置的object,那该类及其子孙类就都是新式类。

class GreatGrandfather:
    x = 111
class Grandfather(GreatGrandfather):
    pass
class Father(Grandfather):
    pass
class Son(Father):
    pass
son_obj_1 = Son()
print(GreatGrandfather.__bases__)  # python3 结果为 (<class 'object'>,)   python2 结果为 ()
print(son_obj_1.x)
print(Son.x)
print(Father.x)
print(Grandfather.x)
# 以上结果都为 111

二、多继承:某个子类继承了多个父类

  1、优点:子类可以使用每个父类的属性,提高了代码的利用率。

  2、缺点:

    ①从思维逻辑上讲,这种子类自身属于某个“大类”的界定变得模糊。

    ②代码的可读性和拓展性变差,有可能会引发“菱形问题”。

  3、如果不可避免地需要使用多继承的方式,应该用mixins机制。

三、用继承解决代码冗余

class Employee:
    gender = 'male'  # 子类共有数据属性
    def __init__(self, name, age):  # 子类实例化对象时共有属性
        self.name = name
        self.age = age
    def show_name(self):  # 子类共有功能
        print('这是员工{}'.format(self.name))
class Worker(Employee):
    def work_time(self, time):  # Worker子类特有功能
        print('{}今日工时为:{}'.format(self.name, time))
class Manager(Employee):
    def __init__(self, name, age, skill):
        Employee.__init__(self, name, age)  # Manager子类实例化对象时,若父类已有,可直接引用
        self.skill = skill  # 父类没有的,再自行定义
    def work_target(self, target):  # Manager子类特有功能
        print('{}本月指标为:{}'.format(self.name, target))
worker_obj_1 = Worker('tom','18')
worker_obj_1.show_name()
worker_obj_1.work_time('8h')
manager_obj_1 = Manager('jan','20','dance')
manager_obj_1.show_name()
manager_obj_1.work_target('10亿')
# 结果为
'''
这是员工tom
tom今日工时为:8h
这是员工jan
jan本月指标为:10亿
'''

四、属性查找顺序

  1、单继承的情况:因为是直线关系,只需遵循辈分由小到大查找即可。

  2、多继承的情况:

    ①非菱形结构,经典类和新式类的查找顺序是一致的,都是按照从左到右的顺序,一个分支寻完再寻下一个分支,最后寻object。

    ②菱形结构:

      经典类:深度优先,查找第一个分支时就会先找到最顶头,再下个分支。

      新式类:广度优先,查找第一个分支时会截止到最顶头之前,待所有分支寻完,再寻最顶头,最后寻object。

    ③总结:多继承有时必须要用,但是继承结构要避免过于复杂,而且最好使用mixins机制。

 

posted on 2020-02-02 04:01  焚音留香  阅读(248)  评论(0编辑  收藏  举报