面向对象编程之继承

一、简介

  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、多继承的情况:

猜你喜欢

转载自www.cnblogs.com/caoyu080202201/p/12669110.html