Python 魔法学院 - 第07篇:Python 包与设计模式 ⭐

news2025/1/12 17:01:03

目录

    • 引言
    • 1. 模块与包管理
      • 1.1 模块与包的基本概念
      • 1.2 模块的导入与使用
      • 1.3 包的导入与使用
      • 1.4 模块与包的管理
      • 1.5 模块与包的对比
      • 1.6 包的详细解释
        • 1.6.1 包的结构
        • 1.6.2 包的导入方式
        • 1.6.3 包的初始化
        • 1.6.4 包的相对导入
        • 1.6.5 包的发布与安装
    • 2. 设计模式简介
      • 2.1 设计模式的基本概念
      • 2.2 常见的设计模式
        • 2.2.1 单例模式
        • 2.2.2 工厂模式
        • 2.2.3 观察者模式
        • 2.2.4 策略模式
      • 2.3 设计模式的对比
    • 3. 案例程序的执行过程与内存结构
      • 3.1 单例模式的执行过程与内存结构
      • 3.2 工厂模式的执行过程与内存结构
      • 3.3 观察者模式的执行过程与内存结构
      • 3.4 策略模式的执行过程与内存结构
    • 4. 总结
    • 5. 互动练习
      • 5.1 练习题
      • 5.2 小测验

引言

欢迎来到 Python 魔法学院的第 7 篇教程!在这一篇中,我们将深入探讨 Python 的包管理以及设计模式。我们将通过生动的案例和详细的解释,帮助你更好地理解这些概念,并提升你的 Python 开发技能。


1. 模块与包管理

1.1 模块与包的基本概念

在 Python 中,模块(module)是一个包含 Python 代码的文件,通常以 .py 为扩展名。模块可以包含函数、类和变量,它们可以被其他 Python 脚本导入和使用。

包(package)则是一个包含多个模块的目录。包通常包含一个特殊的 __init__.py 文件,这个文件可以是一个空文件,也可以包含包的初始化代码。

1.2 模块的导入与使用

在 Python 中,我们可以使用 import 语句来导入模块。例如:

import math

result = math.sqrt(16)
print(result)  # 结果为:4.0

在这个例子中,我们导入了 math 模块,并使用其中的 sqrt 函数来计算 16 的平方根。

1.3 包的导入与使用

包的使用与模块类似,但需要使用点号(.)来访问包中的模块。例如:

import mypackage.mymodule

result = mypackage.mymodule.myfunction()
print(result)  # 结果为:Hello, World!

在这个例子中,我们导入了 mypackage 包中的 mymodule 模块,并调用了其中的 myfunction 函数。

1.4 模块与包的管理

在实际开发中,我们通常会使用 pip 来管理 Python 的包。pip 是 Python 的包管理工具,可以用来安装、卸载和管理 Python 包。

例如,我们可以使用以下命令来安装 requests 包:

pip install requests

安装完成后,我们可以在 Python 脚本中使用 requests 包:

import requests

response = requests.get('https://www.example.com')
print(response.status_code)  # 结果为:200

1.5 模块与包的对比

特性模块
定义单个 .py 文件包含多个模块的目录
导入方式import moduleimport package.module
初始化文件__init__.py
用途组织代码组织多个模块

1.6 包的详细解释

1.6.1 包的结构

一个典型的 Python 包结构如下:

mypackage/
    __init__.py
    module1.py
    module2.py
    subpackage/
        __init__.py
        module3.py
  • __init__.py:这个文件的存在使得 Python 将该目录视为一个包。它可以是一个空文件,也可以包含包的初始化代码。
  • module1.pymodule2.py:这些是包中的模块文件,包含具体的 Python 代码。
  • subpackage/:这是一个子包,包含自己的 __init__.py 和模块文件。
1.6.2 包的导入方式

Python 提供了多种导入包和模块的方式:

  • 导入整个包
    import mypackage
    
  • 导入包中的模块
    import mypackage.module1
    
  • 导入模块中的特定函数或类
    from mypackage.module1 import myfunction
    
  • 导入子包中的模块
    import mypackage.subpackage.module3
    
1.6.3 包的初始化

__init__.py 文件在包被导入时自动执行。它可以用于执行包的初始化代码,或者定义包的公共接口。

例如,mypackage/__init__.py 文件可以包含以下代码:

from .module1 import myfunction
from .module2 import MyClass

这样,当用户导入 mypackage 时,可以直接使用 myfunctionMyClass

import mypackage

mypackage.myfunction()
obj = mypackage.MyClass()
1.6.4 包的相对导入

在包内部,可以使用相对导入来引用其他模块。相对导入使用点号(.)来表示当前模块的位置。

例如,在 mypackage/module1.py 中,可以使用以下方式导入 module2

from . import module2

或者在 mypackage/subpackage/module3.py 中,可以使用以下方式导入 module1

from .. import module1
1.6.5 包的发布与安装

要将自己的包发布到 PyPI(Python Package Index),可以按照以下步骤操作:

  1. 创建 setup.py 文件

    from setuptools import setup, find_packages
    
    setup(
        name='mypackage',
        version='0.1',
        packages=find_packages(),
        install_requires=[
            'requests',
        ],
    )
    
  2. 构建包

    python setup.py sdist bdist_wheel
    
  3. 上传到 PyPI

    twine upload dist/*
    
  4. 安装包

    pip install mypackage
    

2. 设计模式简介

2.1 设计模式的基本概念

设计模式(Design Pattern)是解决软件设计问题的经典解决方案。它们是在多年的软件开发实践中总结出来的最佳实践,可以帮助我们编写更高效、更可维护的代码。

2.2 常见的设计模式

在 Python 中,常见的设计模式包括单例模式、工厂模式、观察者模式等。接下来,我们将通过具体的案例来介绍这些设计模式。

2.2.1 单例模式

单例模式(Singleton Pattern)确保一个类只有一个实例,并提供一个全局访问点。

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2)  # 结果为:True

在这个例子中,我们通过重写 __new__ 方法来实现单例模式。无论我们创建多少个 Singleton 实例,它们都是同一个对象。

2.2.2 工厂模式

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的方式,而无需指定具体的类。

class Dog:
    def speak(self):
        return "Woof!"

class Cat:
    def speak(self):
        return "Meow!"

def get_pet(pet="dog"):
    pets = dict(dog=Dog(), cat=Cat())
    return pets[pet]

dog = get_pet("dog")
print(dog.speak())  # 结果为:Woof!

cat = get_pet("cat")
print(cat.speak())  # 结果为:Meow!

在这个例子中,我们使用工厂模式来创建 DogCat 对象。通过 get_pet 函数,我们可以根据需要创建不同的宠物对象。

2.2.3 观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

class Subject:
    def __init__(self):
        self._observers = []

    def attach(self, observer):
        self._observers.append(observer)

    def detach(self, observer):
        self._observers.remove(observer)

    def notify(self):
        for observer in self._observers:
            observer.update(self)

class Observer:
    def update(self, subject):
        pass

class ConcreteObserver(Observer):
    def update(self, subject):
        print("Subject's state has changed.")

subject = Subject()
observer = ConcreteObserver()
subject.attach(observer)
subject.notify()  # 结果为:Subject's state has changed.

在这个例子中,我们实现了观察者模式。Subject 类维护了一个观察者列表,并在状态发生变化时通知所有观察者。

2.2.4 策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为。

class Strategy:
    def execute(self, data):
        pass

class AddStrategy(Strategy):
    def execute(self, data):
        return sum(data)

class MultiplyStrategy(Strategy):
    def execute(self, data):
        result = 1
        for num in data:
            result *= num
        return result

class Context:
    def __init__(self, strategy):
        self._strategy = strategy

    def execute_strategy(self, data):
        return self._strategy.execute(data)

data = [1, 2, 3, 4]
context = Context(AddStrategy())
print(context.execute_strategy(data))  # 结果为:10

context = Context(MultiplyStrategy())
print(context.execute_strategy(data))  # 结果为:24

在这个例子中,我们使用策略模式来动态选择加法或乘法策略。

2.3 设计模式的对比

设计模式类型用途
单例模式创建型确保一个类只有一个实例
工厂模式创建型提供一种创建对象的方式
观察者模式行为型定义一种一对多的依赖关系
策略模式行为型允许在运行时选择算法的行为

3. 案例程序的执行过程与内存结构

3.1 单例模式的执行过程与内存结构

在单例模式的例子中,我们创建了两个 Singleton 实例 singleton1singleton2。由于单例模式的实现,这两个变量实际上指向同一个对象。

singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2)  # 结果为:True

内存结构如下:

+-----------------+
| Singleton       |
|-----------------|
| _instance       | --> Singleton object
+-----------------+

3.2 工厂模式的执行过程与内存结构

在工厂模式的例子中,我们通过 get_pet 函数创建了 DogCat 对象。

dog = get_pet("dog")
cat = get_pet("cat")

内存结构如下:

+-----------------+
| Dog             |
|-----------------|
| speak()         | --> "Woof!"
+-----------------+

+-----------------+
| Cat             |
|-----------------|
| speak()         | --> "Meow!"
+-----------------+

3.3 观察者模式的执行过程与内存结构

在观察者模式的例子中,Subject 类维护了一个观察者列表,并在状态发生变化时通知所有观察者。

subject = Subject()
observer = ConcreteObserver()
subject.attach(observer)
subject.notify()  # 结果为:Subject's state has changed.

内存结构如下:

+-----------------+
| Subject         |
|-----------------|
| _observers      | --> [ConcreteObserver]
+-----------------+

+-----------------+
| ConcreteObserver|
|-----------------|
| update()        | --> "Subject's state has changed."
+-----------------+

3.4 策略模式的执行过程与内存结构

在策略模式的例子中,我们通过 Context 类动态选择加法或乘法策略。

data = [1, 2, 3, 4]
context = Context(AddStrategy())
print(context.execute_strategy(data))  # 结果为:10

context = Context(MultiplyStrategy())
print(context.execute_strategy(data))  # 结果为:24

内存结构如下:

+-----------------+
| Context         |
|-----------------|
| _strategy       | --> AddStrategy or MultiplyStrategy
+-----------------+

+-----------------+
| AddStrategy     |
|-----------------|
| execute()       | --> sum(data)
+-----------------+

+-----------------+
| MultiplyStrategy|
|-----------------|
| execute()       | --> product of data
+-----------------+

4. 总结

通过本文的学习,我们深入探讨了 Python 的模块与包管理,以及常见的设计模式。我们通过生动的案例和详细的解释,帮助你更好地理解这些概念,并提升你的 Python 开发技能。

5. 互动练习

5.1 练习题

  1. 单例模式:尝试修改单例模式的实现,使其支持线程安全。
  2. 工厂模式:扩展工厂模式的例子,添加一个新的宠物类型(如 Bird)。
  3. 观察者模式:实现一个简单的消息发布-订阅系统,使用观察者模式。

5.2 小测验

  1. 问题:Python 中的 __init__.py 文件的作用是什么?

    • A. 定义包的初始化代码
    • B. 标记目录为 Python 包
    • C. 以上都是
    • 答案:C
  2. 问题:以下哪种设计模式属于创建型模式?

    • A. 单例模式
    • B. 观察者模式
    • C. 策略模式
    • 答案:A

希望这篇文章能够激发你对 Python 的学习兴趣,并帮助你在实际开发中应用这些知识。如果你有任何问题或建议,欢迎在评论区留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高光谱相机的特点

光谱特性 高光谱分辨率:能将光谱范围分割成极窄的波段,光谱分辨率通常达到纳米级甚至亚纳米级,可精确捕捉到不同物质在细微光谱差异上的特征,比如可以区分不同种类的植被因叶绿素含量等差异而在光谱上的细微变化。 多波段探测&a…

1.两数之和--力扣

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…

yolov5+colab跑起来

教程1.先上传网盘再run 教程2.直接上传解压run 本人过程

el-tree拖拽光标错位问题

背景:el-tree实现的分类树增加拖拽功能后,当分类树由于数量较多产生滚动条,如果分类树已滚动,进行拖拽时会造成光标错位的问题: 原因:el-tree拖拽光标定位的高度并未加上滚动的高度解决:将滚动的样式属性放…

Copula算法原理和R语言股市收益率相依性可视化分析

阅读全文:http://tecdat.cn/?p6193 copula是将多变量分布函数与其边缘分布函数耦合的函数,通常称为边缘。在本视频中,我们通过可视化的方式直观地介绍了Copula函数,并通过R软件应用于金融时间序列数据来理解它(点击文…

OpenCV计算机视觉 07 图像的模块匹配

在做目标检测、图像识别时,我们经常用到模板匹配,以确定模板在输入图像中的可能位置 API函数 cv2.matchTemplate(image, templ, method, resultNone, maskNone) 参数含义: image:待搜索图像 templ:模板图像 method&…

相加交互效应函数发布—适用于逻辑回归、cox回归、glmm模型、gee模型

在统计分析中交互作用是指某因素的作用随其他因素水平变化而变化,两因素共同作用不等于两因素单独作用之和(相加交互作用)或之积(相乘交互作用)。相互作用的评估是尺度相关的:乘法或加法。乘法尺度上的相互作用意味着两次暴露的综合效应大于(…

深入解析 Flink 与 Spark 的性能差异

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

工厂人员定位管理系统方案(二)人员精确定位系统架构设计,适用于工厂智能管理

哈喽~这里是维小帮,提供多个场所的定位管理方案,如需获取工厂人员定位管理系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花 在上一篇文章中,我们初步探讨了工厂人员定位管理系统的需求背景以及定位方…

Wi-Fi Direct (P2P)原理及功能介绍

目录 Wi-Fi Direct (P2P)介绍Wi-Fi Direct P2P 概述P2P-GO(P2P Group Owner)工作流程 wifi-Direct使用windows11 wifi-directOpenwrtwifi的concurrent mode Linux环境下的配置工具必联wifi芯片P2P支持REF Wi-Fi Direct &#xff…

Linux第二课:LinuxC高级 学习记录day01

0、大纲 0.1、Linux 软件安装,用户管理,进程管理,shell 命令,硬链接和软连接,解压和压缩,功能性语句,结构性语句,分文件,make工具,shell脚本 0.2、C高级 …

L4-Prompt-Delta

Paper List PromptPapers:https://github.com/thunlp/PromptPapersDeltaPapers: https://github.com/thunlp/DeltaPapers Programming Toolkit OpemPrompt: https://github.com/thunlp/OpenPromptOpenDelta: https://github.com/thunlp/OpenDelta 一、传统微调方法&#xff1…

关于husky8.0 与 4.0的配置

husky的场景使用很多,一般大多场景是在配置git commit 命令拦截hook, 校验 commit-msg 格式规范。以下环境默认:git > 2.27.0, node >14 1、安装huskey8.0.1 npm install --save-dev husky8.0.1 2、初始化配置文件 在package.json scripts 属性…

ML汇总

Introduction and Overview 机器学习算法模型压缩Feature scaling 特征缩放损失函数正则化优化方式激活函数机器学习算法 逻辑回归: 用于二分类问题。它基于一个或多个预测变量建模二元结果的概率。 线性回归: 用于预测基于一个或多个预测变量的连续结果。它通过拟合线性方程来…

Day04-后端Web基础(Maven基础)

目录 Maven课程内容1. Maven初识1.1 什么是Maven?1.2 Maven的作用1.2.1 依赖管理1.2.2 项目构建1.2.3 统一项目结构 2. Maven概述2.1 Maven介绍2.2 Maven模型2.3 Maven仓库2.4 Maven安装2.4.1 下载2.4.2 安装步骤 3. IDEA集成Maven3.1 配置Maven环境3.1.2 全局设置 3.2 Maven项…

spring boot解决swagger中的v2/api-docs泄露漏洞

在配置文件中添加以下配置 #解决/v2/api-docs泄露漏洞 springfox:documentation:swagger-ui:enabled: falseauto-startup: false 处理前: 处理后:

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 📌补充: 📌通常网络中用高低电平,磁盘中用磁化方向来表示。以下是具体说明: 📌如果有一块磁盘要进行销毁该怎么办? 1-2 磁盘存储结构 ​编辑…

CSS如何让一个盒子或内容在指定区域中上下左右居中

要使用CSS让盒子或内容在其父元素中上下左右居中,可以使用多种方法。例如:flexbox布局、使用grid布局、box布局、使用position定位和transform结合、以及表格属性等等,相关属性来实现内容的上下左右的居中。 接下来我们使用以上的方法&#x…

用户注册模块用户校验(头条项目-05)

1 用户注册后端逻辑 1.1 接收参数 username request.POST.get(username) password request.POST.get(password) phone request.POST.get(phone) 1.2 校验参数 前端校验过的后端也要校验,后端的校验和前端的校验是⼀致的 # 判断参数是否⻬全 # 判断⽤户名是否…

Qt学习笔记第81到90讲

第81讲 串口调试助手实现自动发送 为这个名叫“定时发送”的QCheckBox编写槽函数。 想要做出定时发送的效果,必须引入QT框架下的毫秒级定时器QTimer,查阅手册了解详情。 在widget.h内添加新的私有成员变量: QTimer *timer; 在widget类的构造…