首页 > 编程语言 >以Python方式理解Mixin

以Python方式理解Mixin

时间:2024-10-12 22:10:20浏览次数:1  
标签:__ name Python gender self 理解 Mixin age

通过 Python 理解 Mixin 概念-腾讯云开发者社区-腾讯云 (tencent.com)

Mixin 的概念

Mixin 即 Mix-in,常被译为“混入”,是一种编程模式,在 Python 等面向对象语言中,通常它是实现了某种功能单元的类,用于被其他子类继承,将功能组合到子类中。

利用 Python 的多重继承,子类可以继承不同功能的 Mixin 类,按需动态组合使用。

当多个类都实现了同一种功能时,这时应该考虑将该功能抽离成 Mixin 类。

举个例子

定义一个简单的类:

代码语言:javascript 复制
class Person:
    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age

我们可以通过调用实例属性的方式来访问:

代码语言:javascript 复制
p = Person("小陈", "男", 18)
print(p.name)  # "小陈"

然后我们定义一个 Mixin 类:

代码语言:javascript 复制
class MappingMixin:
    def __getitem__(self, key):
        return self.__dict__.get(key)

    def __setitem__(self, key, value):
        return self.__dict__.set(key, value)

这个类可以让子类拥有像 dict 一样调用属性的功能

我们将这个 Mixin 加入到 Person 类中:

代码语言:javascript 复制
class Person(MappingMixin):
    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age

现在 Person 拥有另一种调用属性方式了:

代码语言:javascript 复制
p = Person("小陈", "男", 18)
print(p['name'])  # "小陈"
print(p['age'])  # 18

再定义一个 Mixin 类,这个类实现了 __repr__ 方法,能自动将属性与值拼接成字符串:

代码语言:javascript 复制
class ReprMixin:
    def __repr__(self):
        s = self.__class__.__name__ + '('
        for k, v in self.__dict__.items():
            if not k.startswith('_'):
                s += '{}={}, '.format(k, v)
        s = s.rstrip(', ') + ')'  # 将最后一个逗号和空格换成括号
        return s

利用 Python 的特性,一个类可以继承多个父类:

代码语言:javascript 复制
class Person(MappingMixin, ReprMixin):
    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age

这样这个子类混入了两种功能:

代码语言:javascript 复制
p = Person("小陈", "男", 18)
print(p['name'])  # "小陈"
print(p)  # Person(name=小陈, gender=男, age=18)

总结

Mixin 实质上是利用语言特性,可以把它看作一种特殊的多重继承,所以它并不是 Python 独享,只要支持多重继承或者类似特性的都可以使用,比如 Ruby 中 include 语法,Vue 等前端领域也有 Mixin 的概念。

但 Mixin 终归不属于语言的语法,为了代码的可读性和可维护性,定义和使用 Mixin 类应该遵循几个原则:

1.Mixin 实现的功能需要是通用的,并且是单一的,比如上例中两个 Mixin 类都适用于大部分子类,每个 Mixin 只实现一种功能,可按需继承。

2.Mixin 只用于拓展子类的功能,不能影响子类的主要功能,子类也不能依赖 Mixin。比如上例中 Person 继承不同的 Mixin 只是增加了一些功能,并不影响自身的主要功能。如果是依赖关系,则是真正的基类,不应该用 Mixin 命名。

3.Mixin 类自身不能进行实例化,仅用于被子类继承。

标签:__,name,Python,gender,self,理解,Mixin,age
From: https://www.cnblogs.com/daizichuan/p/18461594

相关文章

  • 第108天:免杀对抗-Python&混淆算法&反序列化&打包生成器&Py2exe&Nuitka
    知识点#知识点:1、Python-对执行代码做文章2、Python-对shellcode做文章3、Python-对代码打包器做文章#章节点:编译代码面-ShellCode-混淆编译代码面-编辑执行器-编写编译代码面-分离加载器-编写程序文件面-特征码定位-修改程序文件面-加壳花指令-资源代码加载面-Dll反......
  • 机器学习主成分分析算法 PCA—python详细代码解析(sklearn)
    一、问题背景在进行数据分析时,我们常常会遇到这样的情况:各个特征变量之间存在较多的信息重叠,也就是相关性比较强。就好比在研究一个班级学生的学习情况时,可能会收集到学生的语文成绩、数学成绩、英语成绩等多个特征变量。但往往会发现,语文成绩好的学生,数学和英语成绩也可能比......
  • Python字符串格式
    文章目录1.数字与ASCII码转换2.字符串输出格式(%)2.1数字进制与小数表示2.2字符串长度与对齐方式3.字符串输出格式(f'')4.字符串输出格式(format)5.转义字符(换行、Tab)6.字符串查找统计替换等1.数字与ASCII码转换将ASCII码转化为数字或者将数字转化为ASCII码时,......
  • 【零基础学Python】项目实战:使用Django框架搭建私人博客第(二)天 —— 注册、登录功能实
    一、前言通过上次的学习我们已经顺利的搭建了一个私人博客框架,接下来我们开始写页面。本章节代码打包上传,资源下载链接:注意:本系列文章旨在使小白在尽可能短的时间内利用Django搭建一个较为完整的项目,因此页面功能将会非常简单,美工==几乎没有,见谅。二、创建应用1.创建accou......
  • 21年计算机挑战赛Python组区域赛题目及个人解答(重置版)
    1.乌鸦喝水代码部分#计算机挑战赛--乌鸦喝水x=int(input('请输入底边的边长:\n'))y=int(input('请输入容器内水面距离瓶子口的距离:\n'))z=0while1:ifx*x*y-8*z<2*x*x:print(f'需要投放{z}个石子乌鸦才能喝到水')breakelse:......
  • Python 潮流周刊#72:Python 3.13.0 最终版已发布!(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了14篇文章,12个开源项目,4则音视频,全文2300字。以下是本期摘要:......
  • 八、Python基础语法(判断语句-下)
    一、ifelifelse结构应用场景:多个判断条件下,并且这些判断条件存在一定的关联。语法:elif也是python中关键字,后面跟一个判断条件,判断条件后面跟冒号存在冒号,需要换行缩进,处于elif缩进中的代码,是eilf代码块。if和多个elif之间,只要有一个条件成立,后续条件不再执行。需......
  • 【python 简易入门应用教程】第一部分:Python 基础
    第一部分:Python基础1.Python简介Python是一种高层次的、解释型的编程语言,由GuidovanRossum于1980年代末发明,并于1991年首次发布。它设计之初的目标是提高代码的可读性和简洁性,采用类似于英语的语法结构。Python的历史与特点历史Python的创始人Guidovan......
  • 【python 简易入门应用教程】第二部分:数据处理与分析
    第二部分:数据处理与分析1.Numpy基础Numpy(NumericalPython)是一个强大的Python库,专为科学计算而设计。它提供了高效的多维数组对象,以及丰富的函数库来操作这些数组。Numpy是数据分析和机器学习项目的基础模块之一,相比于纯Python,其处理大规模数据的效率更高。1.1Numpy......
  • 使用Python爬取免费代理并测试其有效性
    前言在本篇文章中,我们将使用Python编写一个脚本来爬取免费的代理IP地址,并对其进行有效性测试。我们将会用到playwright、aiohttp、pandas等库来完成这个任务。最终我们会得到一个包含有效代理IP地址的列表,并将其保存到本地文件中。1.环境准备首先,你需要确保你的Python环......