精通 Python 装饰器:代码复用与功能增强技巧

精通 Python 装饰器:代码复用与功能增强技巧

    • 引言
    • 装饰器基础
      • 装饰器的定义
      • 基本装饰器的实现方法
      • 理解 `@` 符号的用法
      • 简单装饰器示例代码
    • 使用装饰器增强函数功能
      • 日志记录
      • 性能测试
      • 事务处理
      • 小结
    • 装饰器进阶应用
      • 管理用户认证
      • 缓存机制的实现
      • 参数化装饰器的创建和应用
      • 多个装饰器的堆叠使用
      • 小结
    • 类装饰器
      • 类装饰器与函数装饰器的比较
      • 使用类实现装饰器逻辑
      • 类装饰器的应用场景和示例
      • 小结
    • 装饰器的高级话题
      • 装饰器与闭包的关系
      • 使用装饰器改变函数签名
      • 解决装饰器堆叠时的参数问题
      • 动态决定是否应用装饰器
      • 小结
    • 实战案例:使用装饰器解决实际问题
      • 使用装饰器简化 Flask/Django 应用中的视图权限控制
      • 通过装饰器实现的插件注册机制
      • 动态修改类的属性和方法
      • 小结
    • 总结与展望
      • 装饰器的优点
      • 装饰器的局限性
      • 未来趋势
      • 结语

在这里插入图片描述

引言

在 Python 的世界里,装饰器是一种强大的编程工具,它允许程序员在不改变原有函数定义的前提下,增加额外的功能。装饰器通过一种简洁优雅的方式实现了代码的复用和功能的扩展,极大地提高了代码的可读性和可维护性。不论是在简单的日志记录,还是复杂的权限验证、缓存机制中,装饰器都扮演着不可或缺的角色。

随着 Python 在Web开发、数据分析、人工智能等领域的流行,掌握装饰器变得尤为重要。它不仅仅是一个提升代码质量的工具,更是一种让代码更加 Pythonic 的编程哲学。通过本文的学习,读者将能够深入理解装饰器的工作原理,掌握其使用方法,并能够在实际项目中灵活运用装饰器解决各种问题。

接下来,我们将从装饰器的基础概念开始,逐步深入到它的高级应用,通过丰富的示例代码展示装饰器的强大能力。无论您是中级还是高级开发者,都能在本文中找到对您有用的信息和灵感。让我们一起开始这段探索之旅吧。

装饰器基础

装饰器的定义

在 Python 中,装饰器本质上是一个函数,它可以让其他函数在不改变源代码的情况下增加额外的功能。装饰器接收一个函数作为参数,并返回一个新的函数,新函数通常会加上一些额外的操作,然后返回原函数或者是经过修改的函数。

基本装饰器的实现方法

实现一个最基本的装饰器涉及到定义一个接收函数为参数的函数。这个装饰器函数内部通常会定义另外一个函数,用来包裹原有函数的调用,从而在原有函数执行前后添加额外的逻辑。

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()

在这个例子中,my_decorator 是一个装饰器,它内部定义了一个 wrapper 函数。当 say_hello 函数被调用时,实际上是在调用 wrapper 函数。因此,除了 say_hello 函数本身会打印 “Hello!”,wrapper 函数还会在调用前后打印额外的信息。

理解 @ 符号的用法

在 Python 中,@ 符号是用来应用装饰器的语法糖。如上例所示,@my_decorator 直接放在函数定义前面,这样就可以将 say_hello 函数传递给 my_decorator 装饰器。这种写法让装饰器的应用更加直观和方便。

简单装饰器示例代码

装饰器不仅限于无参数的函数,它们也可以装饰带有参数的函数。为了让装饰器更加通用,可以使用 *args**kwargs 来接受任意数量的参数。

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

say_hello("World")

通过使用 *args**kwargs,我们可以确保装饰器对于不同签名的函数同样适用,这样就大大增强了装饰器的灵活性和实用性。

接下来,我们将探索如何使用装饰器增强函数功能,包括但不限于日志记录、性能测试和事务处理等实际应用场景。

使用装饰器增强函数功能

装饰器的一个核心作用是增强函数的功能,在不修改原始代码的情况下给函数添加新的行为。这一节将通过几个常见的实际应用场景,展示如何使用装饰器来实现这些功能增强。

日志记录

在软件开发过程中,日志记录是一项基本而重要的任务。使用装饰器可以轻松地为任何函数添加日志功能,从而跟踪函数的调用情况。

import logging

def log_decorator(func):
    def wrapper(*args, **kwargs):
        logging.info(f"{func.__name__} was called")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def say_hello(name):
    print(f"Hello, {name}")

say_hello("Python")

这个例子中,log_decorator 装饰器在被装饰的函数执行前记录了一条日志,指明了哪个函数被调用了。这对于调试和监控应用程序的运行非常有帮助。

性能测试

另一个常见用途是测量函数的执行时间,这对于性能优化尤为重要。装饰器能够提供一个简单的方式来实现这一功能。

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time-start_time:.4f} seconds to complete.")
        return result
    return wrapper

@timing_decorator
def slow_function():
    time.sleep(2)

slow_function()

这里的 timing_decorator 装饰器在函数执行前后分别记录时间,然后计算并打印出函数的执行时间。

事务处理

装饰器也经常用于管理数据库事务。这是通过在执行数据库操作的函数前后,添加事务开始和提交或回滚来实现的。

def transaction_decorator(func):
    def wrapper(*args, **kwargs):
        print("Starting a database transaction")
        result = func(*args, **kwargs)
        print("Committing the transaction")
        return result
    return wrapper

@transaction_decorator
def update_database():
    print("Updating database records")

update_database()

在这个简化的例子中,transaction_decorator 模拟了数据库事务的处理过程:在函数执行前后分别打印出了开始和提交事务的信息。在实际应用中,这里的打印语句可以替换为真正的数据库事务控制命令。

小结

通过这些例子,我们可以看到装饰器如何通过一种非侵入式的方式来增强函数的功能。装饰器的这种灵活性使得它成为 Python 编程中不可或缺的工具之一。接下来,我们将探讨装饰器的进阶应用,包括参数化装饰器的创建和使用、以及多个装饰器的堆叠使用等高级话题。

装饰器进阶应用

装饰器的应用不仅限于函数功能的简单增强。通过更高级的使用方式,装饰器可以在更复杂的场景下发挥重要作用,如管理用户认证、实现缓存机制、参数化装饰器的创建和应用,以及多个装饰器的堆叠使用。

管理用户认证

在Web应用中,装饰器经常用于处理用户认证。通过在路由处理函数之前进行用户认证检查,可以确保只有授权的用户才能访问特定的资源。

def auth_decorator(func):
    def wrapper(*args, **kwargs):
        user_authenticated = check_user_authentication() # 假设这是一个检查用户是否认证的函数
        if not user_authenticated:
            raise Exception("用户未认证,无法访问")
        return func(*args, **kwargs)
    return wrapper

@auth_decorator
def sensitive_function():
    print("访问了敏感资源")

# sensitive_function() 在这里会进行用户认证检查

缓存机制的实现

装饰器也常用于实现缓存机制,通过存储函数的返回结果来避免重复执行计算密集型或耗时的操作。

from functools import lru_cache

@lru_cache(maxsize=100) # Python标准库提供的缓存装饰器
def expensive_function(param):
    # 这里是一些计算密集型或耗时的操作
    return result

# 对于相同的参数值,expensive_function 只会执行一次,后续调用会直接返回缓存的结果

参数化装饰器的创建和应用

装饰器可以设计为接受参数,这样就可以在应用装饰器时提供更多的灵活性。参数化装饰器通常需要使用一个外层函数来接收装饰器参数,然后返回一个实际的装饰器。

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

@repeat(times=3)
def print_message(message):
    print(message)

print_message("Hello, World!")

多个装饰器的堆叠使用

Python 允许在一个函数上堆叠多个装饰器,这些装饰器会按照从内到外的顺序执行。

@decorator_one
@decorator_two
def my_function():
    pass

# 等价于
# my_function = decorator_one(decorator_two(my_function))

通过这种方式,可以组合多个装饰器,为函数提供复合的功能增强。

小结

随着对装饰器深入的理解和应用,开发者可以在保持代码清晰和简洁的同时,实现复杂的功能需求。装饰器的这些进阶应用展示了其在实际开发中的强大能力和灵活性。接下来,我们将探讨类装饰器,这是另一种强大的工具,用于在类定义层面上应用装饰器的概念。

类装饰器

类装饰器是一种使用类实现的装饰器,它提供了一种在类定义层面上修改或增强类的功能的方式。与函数装饰器类似,类装饰器也是接收一个类作为参数,并返回一个新的类或者对原有类进行修改后的结果。

类装饰器与函数装饰器的比较

类装饰器和函数装饰器在概念上是相似的,都是为了增强某个对象(函数或类)的功能而存在。不同之处在于,类装饰器主要用于操作类 —— 比如添加、修改类的属性和方法,或者对类的实例化过程进行控制。

使用类实现装饰器逻辑

类装饰器通常通过定义一个实现了 __call__ 方法的类来实现。这个方法让一个类的实例可以像函数一样被调用,这正是类装饰器工作的基础。

class MyDecorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        # 在被装饰的函数执行前可以添加一些逻辑
        print("装饰器逻辑执行前")
        result = self.func(*args, **kwargs)
        # 在被装饰的函数执行后可以添加一些逻辑
        print("装饰器逻辑执行后")
        return result

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

say_hello()

类装饰器的应用场景和示例

类装饰器的一个常见应用场景是资源管理和控制,例如管理数据库连接的打开和关闭,或者自动化测试中的设置和清理工作。

class ResourceDecorator:
    def __init__(self, cls):
        self.cls = cls

    def __call__(self, *args, **kwargs):
        print("资源准备工作")
        instance = self.cls(*args, **kwargs)
        print("资源清理工作")
        return instance

@ResourceDecorator
class MyClass:
    def __init__(self):
        print("MyClass 的实例化")

my_instance = MyClass()

在这个例子中,ResourceDecorator 类装饰器在类 MyClass 的实例化前后添加了资源准备和清理的逻辑。

小结

类装饰器为Python提供了一种强大的机制,用于在不修改类定义的情况下增强和修改类的行为。通过使用类装饰器,开发者可以在更高的抽象层面上控制和管理类的行为,这在许多高级编程场景中非常有用。

接下来,我们将探讨装饰器的一些高级话题,包括装饰器与闭包的关系,使用装饰器改变函数签名,以及动态决定是否应用装饰器等内容。这些话题将帮助开发者更深入地理解装饰器的工作原理和应用范围。

装饰器的高级话题

装饰器是 Python 中一个强大的功能,不仅仅局限于简单地增加函数执行前后的操作。它们可以用于更复杂的编程模式,如动态修改函数行为、基于条件的装饰器应用、以及与闭包的深入结合等。这一节我们将探讨一些装饰器的高级话题。

装饰器与闭包的关系

装饰器和闭包密切相关。事实上,装饰器本身就是利用闭包的概念来实现的。闭包指的是一个函数记住了其外部作用域的变量,即使外部作用域的执行已经结束。装饰器利用闭包来记住原始函数,以及可能的装饰器参数,从而在调用时可以执行额外的逻辑。

使用装饰器改变函数签名

装饰器可以修改或包装原始函数的行为,这包括改变函数的签名。通过在装饰器内部定义包装函数时使用 *args**kwargs,可以确保装饰器对各种签名的函数都是适用的。但是,如果需要修改函数签名,例如添加、删除或更改参数,就需要更细致地操作这些参数。

解决装饰器堆叠时的参数问题

当多个装饰器被应用到同一个函数时,可能会遇到参数不匹配的问题。这是因为每个装饰器都可能会改变函数的签名。解决这个问题的一种方法是使用 functools.wraps 装饰器,它可以帮助保持原始函数的名称、文档字符串、注解和模块信息。

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 执行一些操作
        return func(*args, **kwargs)
    return wrapper

动态决定是否应用装饰器

有时候,我们可能需要基于某些条件动态地决定是否应用装饰器。这可以通过在装饰器内部检查这些条件,并相应地调整装饰器的行为来实现。

def conditional_decorator(condition):
    def actual_decorator(func):
        if condition:
            @wraps(func)
            def wrapper(*args, **kwargs):
                # 执行装饰器增加的功能
                return func(*args, **kwargs)
            return wrapper
        else:
            # 如果不满足条件,返回原始函数
            return func
    return actual_decorator

这个示例展示了如何根据传递给 conditional_decorator 的条件来决定是否对函数应用装饰器。

小结

装饰器是 Python 编程中一个非常强大和灵活的特性,通过掌握其高级应用,开发者可以在不改变原始代码的情况下,灵活地增加或修改程序的功能。这些高级话题的探讨为我们提供了对装饰器更深层次的理解,展示了它们在复杂编程问题中的应用潜力。

接下来,我们将通过一些实战案例,看看如何将装饰器应用到解决实际问题中,如在 Flask 或 Django 应用中进行视图权限控制,实现插件注册机制,以及动态修改类的属性和方法等。

实战案例:使用装饰器解决实际问题

装饰器在实际编程中的应用范围极广,可以解决诸多编程问题,提高代码的可维护性和可读性。本节将通过几个实战案例来展示如何在具体场景中应用装饰器。

使用装饰器简化 Flask/Django 应用中的视图权限控制

在Web开发中,控制用户对不同视图的访问权限是一个常见需求。装饰器可以用来简化这一过程,使得权限控制更加直观和容易管理。

from functools import wraps
from flask import session, redirect

def login_required(func):
    @wraps(func)
    def decorated_function(*args, **kwargs):
        if 'user_id' not in session:
            # 如果用户未登录,则重定向到登录页面
            return redirect('/login')
        return func(*args, **kwargs)
    return decorated_function

# 在Flask视图函数中使用
@app.route('/secret-page')
@login_required
def secret_page():
    return 'This is a secret page'

在这个例子中,login_required 装饰器检查用户是否已经登录(即 session 中是否存在 user_id)。如果用户未登录,请求将被重定向到登录页面。

通过装饰器实现的插件注册机制

装饰器可以用来实现插件的自动注册机制,使得插件的发现和加载变得更加简单。

# 插件注册装饰器和插件存储容器
plugins = {}

def register_plugin(func):
    plugins[func.__name__] = func
    return func

@register_plugin
def my_plugin():
    print("This is my plugin")

# 使用插件
for plugin_name, plugin_func in plugins.items():
    print(f"Executing plugin {plugin_name}")
    plugin_func()

这个例子中,register_plugin 装饰器将函数自动注册为插件,存储在 plugins 字典中。这种机制可以用于开发可扩展的应用程序,其中插件可以在不修改主应用代码的情况下添加新的功能。

动态修改类的属性和方法

类装饰器不仅可以用于实例化前后的资源管理,还可以用来动态地修改类的属性和方法。

def add_class_methods(cls):
    cls.new_method = lambda self: "This is a new method"
    return cls

@add_class_methods
class MyCustomClass:
    pass

instance = MyCustomClass()
print(instance.new_method())  # 输出: This is a new method

在这个例子中,add_class_methods 类装饰器为 MyCustomClass 动态添加了一个新的方法。这展示了装饰器在动态编程中的应用,允许开发者在运行时修改类的行为。

小结

通过这些实战案例,我们看到了装饰器在实际开发中的强大应用,从Web应用的权限控制、插件机制的实现,到动态编程的应用,装饰器都能提供优雅且强大的解决方案。掌握装饰器的使用,可以让开发者在保持代码整洁的同时,实现复杂的编程任务。

接下来,我们将总结本文的内容,并对装饰器的未来应用趋势进行展望。

总结与展望

本文深入探讨了 Python 中装饰器的概念、基础应用、进阶技巧以及实战案例,展示了装饰器如何成为提高代码复用性、增强函数功能、以及优化应用架构的强大工具。从简单的日志记录和性能测试到复杂的权限控制和动态编程,装饰器都展现出了其灵活和强大的能力。

装饰器的优点

  • 代码复用:通过装饰器,可以轻松实现横切关注点(如日志、权限校验等)的复用,减少代码重复。
  • 代码组织:装饰器提供了一种清晰的方式来增强函数功能,有助于维护代码的组织性和可读性。
  • 灵活性:装饰器的设计让它在不修改原有函数定义的情况下增加额外功能,提供了极大的灵活性。

装饰器的局限性

尽管装饰器非常强大,但在使用时也需要注意其局限性:

  • 可读性问题:过度使用或不当使用装饰器可能会使代码难以理解,特别是对于初学者。
  • 性能考虑:装饰器会略微增加函数调用的开销,虽然通常不显著,但在性能敏感的应用中需要注意。

未来趋势

随着编程范式的发展,装饰器在 Python 中的应用将会越来越广泛。特别是在异步编程、Web框架开发、以及云原生应用中,装饰器都将扮演着重要的角色。此外,随着类型提示和静态分析工具的普及,我们可能会看到类型安全的装饰器使用模式,进一步增强装饰器的实用性和安全性。

结语

装饰器是 Python 语言中一个非常强大和灵活的特性,合理使用装饰器可以大大提高代码的质量和开发效率。希望通过本文的学习,读者能够深入理解装饰器的工作原理和应用方法,将其应用到实际开发工作中,解决实际问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android中单例模式正确实现方式

1. 饿汉模式 -线程安全 在类加载时进行实例化, 线程安全,但会导致类加载时间变长。饿汉模式如果使用过多,可能会对App启动耗时带来不利影响。 2. 懒汉模式 -线程不安全 没有加锁, 因此线程不安全。 3. 两次判空 加同步锁 -线程不…

JVM-3

HotSpot虚拟机对象 我在网上看了很多相关的文章,发现在创建对象和对象的结构中内容都不太一样,一些关键字也很不同,于是我通过参考《深入理解Java虚拟机》这本书,自己总结了一篇。 1.对象的创建 当JVM收到一条创建对象的字节码…

基于DiT,支持4K图像生成,华为诺亚0.6B文生图模型PixArt-Σ来了

这个模型和 Sora 一样采用了 DiT 框架。 众所周知,开发顶级的文生图(T2I)模型需要大量资源,因此资源有限的个人研究者基本都不可能承担得起,这也成为了 AIGC(人工智能内容生成)社区创新的一大阻…

C++的学习

代码练习 输入一个字符串&#xff0c;统计其中大写字母、小写字母、数字、空格以及其他字符的个数 #include <iostream>using namespace std;int main() {cout << "请输入一个字符串" << endl;string str;getline(cin,str);int capital 0;int l…

蜂窝物联:智慧水产养殖解决方案

一、系统介绍 集约化水产养殖水质在线监控系统是面向水产养殖集约、高产、高效、生态、安全的发展需求&#xff0c;基于智能传感、无线传感网、通信、智能处理与智能控制等物联网技术开发的&#xff0c;集水质环境参数在线采集、无线传输、智能处理、预警信息发布、决策支持、…

功能测试转自动化测试好不好转型?

手工测试做了好多年&#xff0c;点点点成了每天必须做的事情。但是随着自动化测试趋势的日渐明显&#xff0c;以及受到薪资、技能的双重考验&#xff0c;掌握自动化测试成为了必备技能。 手工转自动化测试&#xff0c;不是一蹴而就的。“预先善其事&#xff0c;必先利其器”&a…

如何看待Linux桌面操作系统的火速增长

文章目录 1. 使用过Linux桌面操作系统吗&#xff1f;Linux系统有什么优势&#xff1f;对于Linux桌面操作系统份额的火速增长怎么看呢认为未来Linux会主导桌面操作系统吗&#xff1f; #如何看待Linux桌面操作系统的火速增长&#xff1f; 1. 使用过Linux桌面操作系统吗&#xff…

LeetCode 707. 设计链表 (JAVA)

1.题目 2. 思路分析 1.我们要设置一个虚拟头节点&#xff0c;因为这个虚拟头节点对于增加节点操作和删除节点操作都很方便。 2.仔细读题&#xff0c;题目中说链表中的节点下标是从0开始的。也就是说第一个节点下标为0。 3.增加节点和删除节点的操作我们都要获取到它前一个的节…

AI交互数字人助力传统景区数字化升级

AI交互数字人在游客体验提升方面具有重要作用。传统景区可以将AI交互数字人以一体机、小程序等形式&#xff0c;与景区游客进行面对面实时交流&#xff0c;为游客提供导览讲解、景区路线指引、文创产品推荐等智能服务&#xff0c;AI交互数字人针对性的为游客提供“吃住行游购娱…

【LeetCode: 289. 生命游戏 + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

神经科常用的5个脑卒中风险评估量表,医生必备!

脑卒中俗称中风&#xff0c;包括缺血性脑卒中和出血性脑卒中。脑卒中风险评估的相关量表&#xff0c;是神经科医生临床常用的量表类型。 常笑医学整理了神经科常用的5个脑卒中风险评估量表&#xff0c;包括Essen脑卒中风险评分量表(ESRS评分)、卒中预测工具-Ⅱ&#xff08;SPI…

Jmeter-使用http proxy代理录制脚本

Jmeter-使用http proxy代理录制脚本 第1步&#xff1a;打卡jmeter工具新增1个线程组 第2步&#xff1a;给线程组添加1个HTTP请求默认值 第3步&#xff1a;设置下HTTP请求默认值第4步&#xff1a;在工作台中新增1个----HTTP代理服务器 第5步&#xff1a;设置HTTP代理服务器 …

一款好用的AI工具——边界AICHAT

目录 一、简介二、注册及登录三、主要功能介绍3.1、模型介绍3.2、对话模型历史记录3.3、创作中心3.4、AI绘画SD3.5、文生图3.6、图生图3.7、线稿生图3.8、艺术二维码3.9、秀图广场3.10、AI绘画创作人像辅助器 一、简介 人工智能&#xff08;AI&#xff09;是一门研究、开发用于…

Linux查看磁盘命令df-h详解

df -h 是一个常用的 Linux 命令&#xff0c;用于查看文件系统的磁盘使用情况并以易于阅读的方式显示。以下是 df -h 命令的详细解释&#xff1a; -h&#xff1a;以人类可读的格式显示磁盘空间大小。例如&#xff0c;使用 GB、MB、KB 等单位代替字节。 执行 df -h 命令后&…

Oracle增量更新备份(更快的备份策略)

正常的备份策略包括&#xff1a;全库备份&#xff0c;full备份&#xff0c;创建镜像备份&#xff0c;累积增量备份以及差异增量备份&#xff1a; 全库备份&#xff1a;如名&#xff0c;对oracle整个数据库进行备份&#xff0c;包括archivedlog&#xff0c;数据文件&#xff0c;…

Altair® Flux® 仿真软件加速电机、传感器和执行器设计

Altair Flux 仿真软件加速电机、传感器和执行器设计 Flux 着眼于机电设备的复杂性&#xff0c;旨在精确优化其性能、效率、尺寸、成本或重量&#xff0c;为终端用户带来更优质的创新的以及高价值的产品。Flux 可对静磁、交流稳态和瞬态条件&#xff0c;以及电热特性进行仿真。…

伪分布式Spark集群搭建

一、软件环境 软 件 版 本 安 装 包 VMware虚拟机 16 VMware-workstation-full-16.2.2-19200509.exe SSH连接工具 FinalShell Linux OS CentOS7.5 CentOS-7.5-x86_64-DVD-1804.iso JDK 1.8 jdk-8u161-linux-x64.tar.gz Spark 3.2.1 spark-3.2.1-bin-…

【Python使用】python高级进阶知识md总结第3篇:静态Web服务器-返回指定页面数据,静态Web服务器-多任务版【附代码文档】

python高级进阶全知识知识笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;操作系统&#xff0c;虚拟机软件&#xff0c;Ubuntu操作系统&#xff0c;Linux内核及发行版&#xff0c;查看目录命令&#xff0c;切换目录命令&#xff0c;绝对路径和相对…

ubuntu 18.04安装教程(详细有效)

文章目录 一、下载ubuntu 18.04镜像二、安装ubuntu1. 点击下载好的Vmware Workstation&#xff0c;点击新建虚拟机&#xff0c;选择 “自定义(高级)”&#xff0c;之后下一步。2. 默认配置&#xff0c;不需要更改&#xff0c;点击下一步。3. 选择 “安装程序光盘映像文件(iso)(…