一日一技:为什么年代久远的 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()

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

目录
相关文章
|
22天前
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1396 4
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
12天前
|
机器学习/深度学习 数据采集 数据可视化
Python 数据分析:从零开始构建你的数据科学项目
【10月更文挑战第9天】Python 数据分析:从零开始构建你的数据科学项目
29 2
|
6天前
|
JSON 搜索推荐 API
Python的web框架有哪些?小项目比较推荐哪个?
【10月更文挑战第15天】Python的web框架有哪些?小项目比较推荐哪个?
20 1
|
12天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
29 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
2月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
83 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
77 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
19天前
|
存储 开发工具 Python
【Python项目】外星人入侵项目笔记
【Python项目】外星人入侵项目笔记
33 3
|
21天前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
40 2
|
21天前
|
Java 程序员 C++
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
20 0
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
|
10天前
|
机器学习/深度学习 算法框架/工具 Python
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
31 0