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