龙空技术网

三十三、Python多重继承使用super关键字调用父类构造方法

数据致美 116

前言:

此时姐妹们对“python子类父类”可能比较关注,你们都需要分析一些“python子类父类”的相关文章。那么小编同时在网摘上搜集了一些有关“python子类父类””的相关资讯,希望我们能喜欢,大家一起来了解一下吧!

Python面向对象编程中的super关键字

1.问题探查

在Python中,子类会通过继承得到父类的构造方法,如果子类有多个直接父类,那么排在前面的类的构造方法会被优先使用。

比如:

class Staff:    def __init__(self, name, age, job, salary):        self.name = name        self.age = age        self.job = job        self.salary = salary    def work(self):        print(f'{self.name}正在工作, 工作内容是{self.job}, 工资是{self.salary}')class Customer:    def __init__(self, name, hobby, location):        self.name = name        self.hobby = hobby        self.location = location    def visit(self):        print(f'{self.name}正在出差到外地访问客户, 我喜欢{self.hobby}, 我住在{self.location}')class Manager(Staff, Customer):    pass# 实例化Manager类生成对象m = Manager('风清扬',50,'打野升级',50000)# 调用父类方法work()m.work() # 输出:# 调用父类方法visit()m.visit()

执行上面代码,结果是:

风清扬正在工作, 工作内容是打野升级, 工资是50000---------------------------------------------------------------------------AttributeError                            Traceback (most recent call last) in      29 m.work() # 输出:     30 # 调用父类方法visit()---> 31 m.visit() in visit(self)     17      18     def visit(self):---> 19         print(f'{self.name}正在出差到外地访问客户, 我喜欢{self.hobby}, 我住在{self.location}')     20      21 class Manager(Staff, Customer):AttributeError: 'Manager' object has no attribute 'hobby'

从上面代码可以知道,Manager类直接继承了两个父类Staff和Customer, 从多继承的原理看,Manager类会优先继承Staff类的构造方法,所以程序使用类Staff的构造参数来实例化m, 会初始化name, age, job, 和salary实例变量,因此在调用m.work()方法时没有问题,得到了正确的结果。

但是,当调用m.visit()方法时,由于使用的是Staff的构造方法,程序并未初始化Customer的两个实例变量hobby和location, 因此会报错。

2.解决方案

为了能解决子类Manager能同时初始化两个直接父类中的实例变量,Manager类应当自己定义自己的构造方法,根据Python的要求,如果子类重写了父类的构造方法,那么子类的构造方法必须调用父类的构造方法。

子类调用父类的构造方法通常有两种实现方式:

使用未绑定方法,因这__init__构造方法也是实例方法,可以这样调用。比如:Customer.__init__(self, name, hobby, location)使用super()函数调用父类构造方法。比如:super().__init__(name, hobby, location)代码实现

class Staff:    def __init__(self, name, age, job, salary):        self.name = name        self.age = age        self.job = job        self.salary = salary    def work(self):        print(f'{self.name}正在工作, 工作内容是{self.job}, 工资是{self.salary}')class Customer:    def __init__(self, name, hobby, location):        self.name = name        self.hobby = hobby        self.location = location    def visit(self):        print(f'{self.name}正在出差到外地访问客户, 我喜欢{self.hobby}, 我住在{self.location}')class Manager(Staff, Customer):    # 重写父类构造方法    def __init__(self, name, age, job, salary, hobby, location):        print('<<<<<<<<<<<<<Manager的构造方法>>>>>>>>>>>')        # 通过super()函数调用父类的构造方法        super().__init__(name,age,job,salary)  # 也可以这样写 super(Manager, self).__init__(name, age, job, salary)        # 使用未绑定方式调用Customer父类的构造方法        Customer.__init__(self,name, hobby, location)# 实例化Manager类生成对象m = Manager('风清扬',50,'打野升级',50000,'找令狐冲','华山')# 调用父类方法work()m.work() # 输出:# 调用父类方法visit()m.visit()

输出结果

下篇文章将介绍Python面向对象三大特征之多态

标签: #python子类父类 #python子类调用父类方法且父类方法中含有变量 #python子类访问父类的变量 #python类继承super