10-高级主题

第10节 高级主题

在这一节中,我们将探讨一些 Python 中的高级主题,包括装饰器、生成器、上下文管理器、元类以及常用的设计模式。这些高级特性能够帮助你编写更强大、更灵活的代码。

10.1 装饰器

装饰器是一种特殊类型的函数,可以修改其他函数的功能或行为,而无需改变原函数的代码。装饰器通常用于日志记录、性能测试、事务处理等场景。

基本语法:

@decorator
def function_to_decorate():
    pass

示例:

  1. 定义一个简单的装饰器:

    def my_decorator(func):
        def wrapper():
            print("Something is happening before the function is called.")
            func()
            print("Something is happening after the function is called.")
        return wrapper

    @my_decorator
    def say_hello():
        print("Hello!")

    say_hello()

    输出:

    Something is happening before the function is called.
    Hello!
    Something is happening after the function is called.
  2. 带参数的装饰器:

    def repeat(num_times):
        def decorator(func):
            def wrapper(*args, **kwargs):
                for _ in range(num_times):
                    result = func(*args, **kwargs)
                return result
            return wrapper
        return decorator

    @repeat(3)
    def greet(name):
        print(f"Hello, {name}!")

    greet("Alice")

    输出:

    Hello, Alice!
    Hello, Alice!
    Hello, Alice!
10.2 生成器

生成器是一种特殊的迭代器,可以生成一系列值,但不占用大量内存。生成器使用 yield 关键字来生成值。

基本语法:

def generator_function():
    yield value

示例:

  1. 定义一个简单的生成器:

    def count_up_to(n):
        count = 1
        while count <= n:
            yield count
            count += 1

    counter = count_up_to(5)
    for num in counter:
        print(num)

    输出:

    1
    2
    3
    4
    5
  2. 生成器表达式:

    even_numbers = (x for x in range(10if x % 2 == 0)
    for num in even_numbers:
        print(num)

    输出:

    0
    2
    4
    6
    8
10.3 上下文管理器

上下文管理器用于管理资源的生命周期,确保资源在使用后正确释放。通常使用 with 语句来实现上下文管理。

基本语法:

with context_manager as resource:
    # 使用资源

示例:

  1. 定义一个简单的上下文管理器:

    class ManagedFile:
        def __init__(self, filename):
            self.filename = filename

        def __enter__(self):
            self.file = open(self.filename, 'r')
            return self.file

        def __exit__(self, exc_type, exc_val, exc_tb):
            if self.file:
                self.file.close()

    with ManagedFile('example.txt'as file:
        content = file.read()
        print(content)
  2. 使用 contextlib 模块中的 contextmanager 装饰器:

    from contextlib import contextmanager

    @contextmanager
    def managed_file(filename):
        try:
            file = open(filename, 'r')
            yield file
        finally:
            file.close()

    with managed_file('example.txt'as file:
        content = file.read()
        print(content)
10.4 元类

元类是创建类的类。元类允许你在类创建时动态地修改类的行为。

基本语法:

class Meta(type):
    def __new__(cls, name, bases, dct):
        # 修改类的行为
        return super().__new__(cls, name, bases, dct)

class MyClass(metaclass=Meta):
    pass

示例:

  1. 定义一个简单的元类:

    class UpperCaseMeta(type):
        def __new__(cls, name, bases, dct):
            upper_case_dct = {}
            for key, value in dct.items():
                if callable(value):
                    upper_case_dct[key.upper()] = value
                else:
                    upper_case_dct[key] = value
            return super().__new__(cls, name, bases, upper_case_dct)

    class MyClass(metaclass=UpperCaseMeta):
        def greet(self):
            print("Hello, World!")

    obj = MyClass()
    obj.GREET()  # 注意方法名变为大写

    输出:

    Hello, World!
10.5 常用设计模式

设计模式是解决常见问题的通用模板。以下是一些常用的 Python 设计模式:

  • 单例模式:确保一个类只有一个实例,并提供一个全局访问点。
  • 工厂模式:定义一个创建对象的接口,但让子类决定实例化哪个类。
  • 观察者模式:定义对象间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。

示例:

  1. 单例模式:

    class Singleton:
        _instance = None

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

    s1 = Singleton()
    s2 = Singleton()

    print(s1 is s2)  # 输出: True
  2. 工厂模式:

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

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

    class AnimalFactory:
        def get_animal(self, animal_type):
            if animal_type == "dog":
                return Dog()
            elif animal_type == "cat":
                return Cat()
            else:
                raise ValueError("Invalid animal type")

    factory = AnimalFactory()
    dog = factory.get_animal("dog")
    cat = factory.get_animal("cat")

    print(dog.speak())  # 输出: Woof!
    print(cat.speak())  # 输出: Meow!
  3. 观察者模式:

    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, message):
            for observer in self._observers:
                observer.update(message)

    class Observer:
        def update(self, message):
            print(f"Received message: {message}")

    subject = Subject()
    observer1 = Observer()
    observer2 = Observer()

    subject.attach(observer1)
    subject.attach(observer2)

    subject.notify("Hello, Observers!")  # 输出: Received message: Hello, Observers! (两次)

小结

通过本节的学习,你应该已经掌握了 Python 中的一些高级主题,包括装饰器、生成器、上下文管理器、元类以及常用的设计模式。这些高级特性能够帮助你编写更强大、更灵活的代码,提升程序的性能和可维护性。下一节我们将继续学习 Python 中的网络编程。

本文由 mdnice 多平台发布

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

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

相关文章

蓝桥杯分治

P1226 【模板】快速幂 题目描述 给你三个整数 &#x1d44e;,&#x1d44f;,&#x1d45d;a,b,p&#xff0c;求 &#x1d44e;&#x1d44f; mod &#x1d45d;abmodp。 输入格式 输入只有一行三个整数&#xff0c;分别代表 &#x1d44e;,&#x1d44f;,&#x1d45d;a,b,p。…

【webApp之h5端实战】首页评分组件的原生实现

关于评分组件,我们经常在现代前端框架中用到,UI美观效果丰富,使用体验是非常不错的。现在自己动手使用原生js封装下评分组件,可以用在自己的项目中。 组件实现原理 点击的❤左侧包括自己都是高亮的样式,右侧都是灰色的样式,这样就能把组件的状态区分开了。右边再加上辅…

C++小碗菜之二:软件单元测试

“没有测试的代码重构不能称之为重构&#xff0c;它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试&#xff1f; 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…

ssm 多数据源 注解版本

application.xml 配置如下 <!-- 使用 DruidDataSource 数据源 --><bean id"primaryDataSource" class"com.alibaba.druid.pool.DruidDataSource" init-method"init" destroy-method"close"></bean> <!-- 使用 数…

【C++】格式化输出详解:掌握 cout 的进阶用法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;格式化输出的理论概述&#x1f4af;控制输出宽度和填充字符setw 操作符setfill 操作符 &#x1f4af;控制浮点数的显示格式fixed 与 scientificsetprecision &#x1f4af;…

uC/OSII学习笔记(一)任务的增删改查

使用天玛智控的控制器&#xff0c;基础工程文件已移植ucosii。 正常的任务创建流程为&#xff1a; 1.OSInit()&#xff1b; 2.OSTaskCreate()&#xff1b; 3.OSStart()&#xff1b; 但是天玛对其有做修改&#xff0c;任务创建直接调用OSTaskCreate()函数即可&#xff0c;不用在…

【日常记录-Mybatis】PageHelper导致语句截断

1. 简介 PageHelper是Mybatis-Plus中的一个插件&#xff0c;主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象&#xff0c;并保存到本地线程ThreadLocal中&#xff0c;接下来&#xff0c;PageHelper会进入Mybatis的拦截器环节&#xff0c;…

Linux入门攻坚——40、Linux集群系统入门-lvs(1)

Cluster&#xff0c;集群&#xff0c;为了解决某个特定问题将多台计算机组合起来形成的单个系统。 这个单个集群系统可以扩展&#xff0c;系统扩展的方式&#xff1a;scale up&#xff0c;向上扩展&#xff0c;更换更好的主机&#xff1b;scale out&#xff0c;向外扩展&…

Canal 深入解析:从原理到实践的全面解读

Canal 深入解析&#xff1a;从原理到实践的全面解读 官网&#xff1a;https://github.com/alibaba/canal Canal 是阿里巴巴开源的一款分布式增量数据同步工具&#xff0c;广泛应用于数据同步、实时数据处理和数据库的增量备份等场景。它可以通过监听 MySQL 数据库的 binlog&am…

Java中的数据存储结构解析与应用

一、引言 在Java编程中&#xff0c;数据存储结构是程序设计的基础。合理选择和使用数据结构可以提高程序的性能和可维护性。本文将带您了解Java中的各种数据存储结构&#xff0c;并探讨其优缺点及适用场景。 二、基本数据类型 Java提供了8种基本数据类型&#xff0c;分别是b…

Home Assistant智能家居盒子用了一段时间发现没有存储空间了,怎么清理释放?

环境&#xff1a; Unbuntu 20.04 Home Assistant 2023.8.0 问题描述&#xff1a; Home Assistant智能家居盒子用了一段时间发现没有存储空间了&#xff0c;怎么清理释放&#xff1f; 解决方案&#xff1a; 1.查看HA日志文件&#xff0c;有比较大&#xff0c;直接删了 2.查…

【NoSQL数据库】MongoDB数据库的安装与卸载

目录 一、MongoDB原理 二、MongoDB的安装和卸载 三、注意事项 一、MongoDB原理 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关…

前缀和:JAVA

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 求fib数列的第n项&#xff0c;前几项是1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5,每一项都等于前面两项的和 输入描述: 输入一个整数n&#xff0c;n<46 输出描述: 输出一个…

【Java】2、集合

目录 CollectionListSet *重点&#xff1a; 底层机制&#xff08;源码&#xff09;应用场景 好处&#xff1a; 数组&#xff08;长度不可改&#xff0c;同一类型&#xff0c;增删不便&#xff09;集合&#xff08;动态保存&#xff0c;多种类型&#xff0c;方便操作&#xff09…

【CSS in Depth 2 精译_068】11.2 颜色的定义(下):CSS 中的各种颜色表示法简介

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 ✔️ 11.2.2.…

JavaScript 进销存计算错误——

一、js错误 二、正确操作 var 税率修正 parseFloat(data.tax_rate);

Neo4j:图数据库使用入门

文章目录 一、Neo4j安装1、windows安装&#xff08;1&#xff09;准备环境&#xff08;2&#xff09;下载&#xff08;3&#xff09;解压&#xff08;4&#xff09;运行&#xff08;5&#xff09;基本使用 2、docker安装 二、CQL语句1、CQL简介2、CREATE 命令&#xff0c;创建节…

云标准:云计算标准

云计算标准是确保云计算技术、服务和应用发展的重要规范&#xff0c;它们对于提高云计算系统的互操作性、可靠性和安全性至关重要。以下是对云计算标准的详细解释&#xff1a; 1.云计算标准的定义和分类 云计算标准是指云计算领域的技术规范和标准&#xff0c;包括云计算基础…

沃丰科技智能客服在电商独立站中有哪些核心功能?

在数字化飞速发展的今天&#xff0c;电商独立站作为企业与消费者沟通的重要桥梁&#xff0c;其客户服务的质量和效率直接关系到企业的竞争力和市场地位。沃丰科技智能客服以其全面的功能&#xff0c;成为了电商独立站接入的首选&#xff0c;为电商企业提供了全新的解决方案。 …

【初阶数据结构与算法】二叉树链式结构的定义与实现万字笔记(附源码)

文章目录 一、二叉树链式结构的定义二、二叉树链式结构功能的基本实现1.链式二叉树的手动创建2.链式二叉树的前中后序遍历前序遍历中序遍历后序遍历 3.链式二叉树节点的个数4.链式二叉树叶子节点的个数5.链式二叉树的高度/深度6.链式二叉树第k层节点的个数7.链式二叉树的查找8.…