python之类的继承|Mixin机制|mro函数
作者:YXN-python 阅读量:254 发布日期:2023-11-23
# 共同类(父类)
class staff_class():
def __init__(self, name, id, gender):
self.name = name
self.id = id
self.gender = gender
def print_(self):
print(f'名字:{self.name}\n身份证号:{self._id}\n性别:{self.gender}')
# 兼职员工类
class part_timer(staff_class):
def __init__(self, name, id, gender, working_days, day_rate):
super().__init__(name, id, gender)
self.gender = gender
self.name = name
self.working_days = working_days
self.day_rate = day_rate
def print_(self):
return '名字:{}\n身份证号:{}\n性别:{}\n工资:{}'\
.format(self.name,self.id,self.gender,self.working_days*self.day_rate)
# 正式员工类
class regular(staff_class):
def __init__(self, name, id, gender, monthly_pay):
super().__init__(name, id, gender)
self.monthly_pay = monthly_pay
def print_(self):
return '名字:{}\n身份证号:{}\n性别:{}\n工资:{}'\
.format(self.name,self.id,self.gender,self.monthly_pay)
# part_timer 存在 print_ 方法就调用,没有就调用父类的 print_ 方法
staff_a = part_timer('yxn','123456', '男', 20, 180)
print(staff_a.print_())
staff_b = regular('yxn','123456', '男', 5000)
print(staff_b.print_())
这段代码是一个员工类程序,包括共同类(父类)staff_class,兼职员工类part_timer和正式员工类regular。
staff_class包含员工的姓名、身份证号和性别,以及一个打印员工信息的方法。
兼职员工类part_timer和正式员工类regular分别继承staff_class类,并且都有自己的打印方法,用于打印不同类型员工的信息。
在代码的最后,创建了一个part_timer对象staff_a和一个regular对象staff_b,分别调用了它们的打印方法,打印出员工的信息。
多继承
Python提供了一个内置函数mro(),包返回类的方法解析顺序。这个函数对于理解多重继承中的方法调用顺序非常有用。
# 定义两个基类
class A:
def print1(self):
print("A.print1")
class B:
def print2(self):
print("B.print2")
# 定义一个子类,继承自 A 和 B
class C(A, B):
def print3(self):
print("C.print3")
# 创建SubClass的实例
obj = C()
# 调用继承来的方法
obj.print1() # 输出: A.print1
obj.print2() # 输出: B.print2
obj.print3() # 输出: C.print3
print(C.mro()) # [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
Mixin机制
Mixin类通常包含一组特定的方法,这些方法可以被其他类直接继承使用。Mixin类通常不会被单独实例化,而是作为其他类的基类。
功能单一:如果有多个功能,应该写多个Mixin类。这样可以保证每个Mixin类的责任单一,便于管理和理解
责任明确:Mixin类应该表示某一种功能,而不是某个物品。通常,Mixin类的命名会遵循一定的规范,在类名末尾加上Mixin,以示其为一个Mixin类
避免菱形问题:Python通过C3线性化算法来解决多重继承中的菱形继承问题,确保方法调用的唯一性和一致性
# MixIns机制
class Fowl: # 家禽类 (事务)
pass
class SwinMixIn: # (功能)
def swimming(self):
pass
class Chicken(Fowl): # 鸡
pass
class Duck(SwinMixIn, Fowl): # 鹏
pass
class Goose(SwinMixIn, Fowl): # 照
pass
YXN-python
2023-11-23