一日一技:为什么年代久远的 Python 项目里面那么多默认参数?

简介: 一日一技:为什么年代久远的 Python 项目里面那么多默认参数?

摄影:产品经理蜡烛上面的跑马灯

在写 Python 代码的时候,大家可能会在不知不觉中使用一些设计范式。我们来看两个例子。

假设有一个类People

class People:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
    def dance(self):
        print('我在跳舞')
    def study(self):
        print('我在学习')
    def eat(self):
        print('我在吃东西')

现在我们有另一个类ClassRoom:

class ClassRoom:
    def __init__(self, size):
        self.size = size
        self.student = People('小明', 17, '男')
    def start_class(self):
        self.student.study()

我们在ClassRoom的构造函数中,初始化了一个 student 对象,然后在start_class方法中,调用了这个对象的study方法。

这个过程看起来似乎没有什么问题,相信很多读者也是这样写代码的。

现在,我们再增加两个类:

class Restaurant:
    def __init__(self, name):
        self.name = name
        self.consumer = People('张三', 30, '男')
    def start_launch(self):
        self.consumer.eat()
class Ballroom:
    def __init__(self, address):
        self.address = address
        self.dancer = People('小红', 20, '女')
    def open(self):
        self.dancer.dance()

新增加的两个类RestaurantBallroom的构造函数里面都通过People类初始化了对象。然后在调用这个对象的方法。

这样写看起来没有问题,能正常工作,代码也不丑。

现在,People类需要修改一下它的构造函数:

class People:
    def __init__(self, name, age, sex, address):
        self.name = name
        self.age = age
        self.sex = sex
    def dance(self):
        print('我在跳舞')
    def study(self):
        print('我在学习')
    def eat(self):
        print('我在吃东西')

在初始化People类时,需要传入一个address参数。现在怎么办?

于是ClassRoomRestaurantBallroom这三个类的构造函数都要随之做修改,全都得加上这个address参数。

这就叫做牵一发而动全身

很多人为了避免做这样的修改,会把新增加的这个参数address改成默认参数:

class People:
    def __init__(self, name, age, sex, address=''):
        self.name = name
        self.age = age
        self.sex = sex
    def dance(self):
        print('我在跳舞')
    def study(self):
        print('我在学习')
    def eat(self):
        print('我在吃东西')

这样看起来,另外三个类的代码就不需要做任何修改了。

这就是为什么你们公司的代码里面,很多函数会带上大量奇奇怪怪的默认参数的原因。

在编程范式中,有一个术语叫做依赖注入,就是为了解决这个问题的。

而且做起来简单到你觉得这是在逗你,把People初始化以后的对象传到其他类的构造函数中即可:

class Ballroom:
    def __init__(self, address, dancer):
        self.address = address
        self.dancer = dancer
    def open(self):
        self.dancer.dance()
dancer = People('小红', 20, '女')
ballroom = Ballroom('xxx', dancer)
ballroom.open()

虽然叫做编程范式,但也不是说应该始终使用依赖注入。例如你的代码会层层调用,难道从第一层把对象一层一层传到最里面去?所以应该根据实际情况来进行选择。

目录
相关文章
|
2月前
|
Python
Python项目配置Dockerfile
该Dockerfile基于阿里云Alinux3的Python 3.11.1镜像构建,使用阿里云PyPI镜像加速依赖安装,部署一个运行于5000端口、时区为上海的Python应用。
173 1
|
25天前
|
异构计算 Python
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
177 1
|
1月前
|
API 语音技术 开发者
Python 项目打包,并上传到 PyPI,分享项目
本文介绍了如何使用 Poetry 打包并发布一个 Python 项目至 PyPI。内容包括:项目创建、配置 `pyproject.toml` 文件、构建软件包、上传至 PyPI、安装与使用。通过实例 iGTTS 展示了从开发到发布的完整流程,帮助开发者快速分享自己的 Python 工具。
|
25天前
|
人工智能 Shell Python
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
156 0
|
29天前
|
JSON 缓存 开发者
淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战
本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
|
3月前
|
算法 数据可视化 数据挖掘
基于EM期望最大化算法的GMM参数估计与三维数据分类系统python源码
本内容展示了基于EM算法的高斯混合模型(GMM)聚类实现,包含完整Python代码、运行效果图及理论解析。程序使用三维数据进行演示,涵盖误差计算、模型参数更新、结果可视化等关键步骤,并附有详细注释与操作视频,适合学习EM算法与GMM模型的原理及应用。
|
4月前
|
监控 大数据 API
Python 技术员实践指南:从项目落地到技术优化
本内容涵盖Python开发的实战项目、技术攻关与工程化实践,包括自动化脚本(日志分析系统)和Web后端(轻量化API服务)两大项目类型。通过使用正则表达式、Flask框架等技术,解决日志分析效率低与API服务性能优化等问题。同时深入探讨内存泄漏排查、CPU瓶颈优化,并提供团队协作规范与代码审查流程。延伸至AI、大数据及DevOps领域,如商品推荐系统、PySpark数据处理和Airflow任务编排,助力开发者全面提升从编码到架构的能力,积累高并发与大数据场景下的实战经验。
Python 技术员实践指南:从项目落地到技术优化
|
4月前
|
XML JSON 安全
分析参数顺序对Python requests库进行POST请求的影响。
最后,尽管理论上参数顺序对POST请求没影响,但编写代码时仍然建议遵循一定的顺序和规范,比如URL总是放在第一位,随后是data或json,最后是headers,这样可以提高代码的可读性和维护性。在处理复杂的请求时,一致的参数顺序有助于调试和团队协作。
140 9
|
6月前
|
程序员 测试技术 开发工具
怎么开发Python第三方库?手把手教你参与开源项目!
大家好,我是程序员晚枫。本文将分享如何开发Python第三方库,并以我维护的开源项目 **popdf** 为例,指导参与开源贡献。Popdf是一个PDF操作库,支持PDF转Word、转图片、合并与加密等功能。文章涵盖从fork项目、本地开发、单元测试到提交PR的全流程,适合想了解开源贡献的开发者。欢迎访问[popdf](https://gitcode.com/python4office/popdf),一起交流学习!
224 21
怎么开发Python第三方库?手把手教你参与开源项目!
|
9月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
382 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本

热门文章

最新文章

推荐镜像

更多