您现在的位置是:网站首页 > 博客日记 >

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