超级实用!Python设计模式精粹

liftword5个月前 (12-07)技术文章52
# 小伙伴们,大家好!今天猿梦家要带大家探索的是Python中的设计模式。
设计模式就像是一套武功秘籍,能让我们在编程时更加得心应手。
它们是经过前人总结的最佳实践,可以帮助我们解决常见的设计问题,让代码更加优雅和易于维护。
今天,我们就来一起学习几个最常用的Python设计模式吧!

## 一、单例模式

**单例模式**确保一个类只有一个实例,并提供一个全局访问点。
它常用于需要全局状态管理的场景,比如配置管理、日志记录等。

```python
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

# 测试单例模式
s1 = Singleton()
s2 = Singleton()
print(s1 == s2)  # True,说明s1和s2是同一个实例

小贴士__new__方法是一个特殊方法,用于创建类的实例。通过重写它,我们可以控制实例的创建过程。

二、工厂模式

工厂模式提供了一种创建对象的接口,而无需指定其具体的类。这样,我们可以在不修改客户端代码的情况下,灵活地切换具体实现。

class Animal:
    def speak(self):
        pass

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

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

class AnimalFactory:
    @staticmethod
    def create_animal(animal_type):
        if animal_type == "dog":
            return Dog()
        elif animal_type == "cat":
            return Cat()
        return None

# 使用工厂模式创建对象
dog = AnimalFactory.create_animal("dog")
cat = AnimalFactory.create_animal("cat")
print(dog.speak())  # Woof!
print(cat.speak())  # Meow!

小贴士:工厂模式可以很好地与依赖注入等设计模式结合使用,提高代码的灵活性和可维护性。

三、观察者模式

观察者模式定义了对象间的一对多依赖关系,当一个对象改变状态时,其相关依赖对象会得到通知并被自动更新。它常用于实现事件驱动的系统。

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("Observer has been notified!")

# 使用观察者模式
subject = Subject()
observer = ConcreteObserver()
subject.attach(observer)
subject.notify()  # Observer has been notified!

小贴士:观察者模式在GUI编程、消息推送等场景中非常有用。

四、策略模式

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。

class Strategy:
    def do_operation(self, num1, num2):
        pass

class OperationAdd(Strategy):
    def do_operation(self, num1, num2):
        return num1 + num2

class OperationSubtract(Strategy):
    def do_operation(self, num1, num2):
        return num1 - num2

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

    def execute_strategy(self, num1, num2):
        return self._strategy.do_operation(num1, num2)

# 使用策略模式
context = Context(OperationAdd())
print(context.execute_strategy(10, 5))  # 15
context = Context(OperationSubtract())
print(context.execute_strategy(10, 5))  # 5

小贴士:策略模式非常适合于需要根据不同条件选择不同算法的场景,比如排序算法的选择、支付方式的选择等。

五、装饰器模式

装饰器模式动态地给一个对象添加一些额外的职责,而无需修改其原有的代码。在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()
# 输出:
# Something is happening before the function is called.
# Hello!
# Something is happening after the function is called.

小贴士:装饰器在Python中非常常见,比如用于日志记录、性能测量、权限校验等场景。

总结

小伙伴们,今天我们一起学习了五个常用的Python设计模式:单例模式、工厂模式、观察者模式、策略模式和装饰器模式。每个模式都有其独特的应用场景和优势,通过学习和实践这些模式,我们可以让我们的代码更加优雅、可维护和可扩展。

记得动手敲代码哦!你可以尝试将这些模式应用到你的项目中,看看它们是如何发挥作用的。如果有任何问题或者疑问,随时在评论区问猿小哥哦!祝大家学习愉快,Python学习节节高!

相关文章

Python编程,Flet 控件学习1:文本控件 / 添加、更新

Flet的用户界面控件是普通的 Python 类。要使控件对用户可见,必须将其添加到 Page 或其他控件中。Page 是最顶层的控件,各类控件嵌套在一起成为一棵以 Page 为根的“树”。 初始化控...

【nis】-个python中非常有用的库

探索 NIS:让 Python 编成更高效的秘密武器在这个数据驱动的时代,Python 作为一种强大的编程语言,得到了广泛的应用。而在众多 Python 其中,NIS(Network Informa...

新的开源 Python 库AISuite 提供统一的跨 LLM API

Andrew Ng最近宣布,aisuite旨在围绕目前最流行的大型语言模型 (LLM) 提供类似 OpenAI 的 API,以便开发人员可以轻松尝试它们并比较结果或从一个 LLM 切换到另一个 LLM...

深入了解 Python 的 Signal 库:让你的程序更“聪明”

你知道吗?在Python中,有一个非常有用的库叫做Signal,它可以帮助你轻松处理信号和事件。这种功能在创建响应式应用时尤其重要。今天,跟随我们一起深入探讨Signal,让它成为你工具箱中的另一个强...