Python 设计模式

本文介绍了Python设计模式,包括鸭子类型、对象组织优于继承的概念,以及行为模式如Iterator、Chain of Responsibility、Command、Singleton等。文章还探讨了如何在Python中实现这些模式,并提供了具体的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 设计模式

for sleek and fashionable code

概述

两天重要原则

  • Program to an interface not an implementation
  • Favor object composition over inheritacne

鸭子类型Duck Typing

如果该对象的行为像鸭子, 就可以认为是鸭子

鸭子类型出现在动态语言中(dynamic languages)不具备强类型, 不需要指定类型就可以调用对象的一个存在的方法.

更喜欢对象的组织,而不是继承

如下: 为业务向的代码, 有两种实现方法:

  1. 直接继承DBclass 然后重写父类的方法
  2. object composition的形式去组织

inheritance.py

class User(Dbclass):
    pass

object composition

class User(object):
    _persist_methods = ['get', 'save', 'delete']

    def __init__(self, persister):
        self._persister = persister

    def __getattr__(self, attribute):
        if attribute in self._persist_methods:
            return getattr(self._persister, attribute)

Behavioral Patterns

Behavioral Patterns 为对象之间的交互而生. 根据GOF principles, 有11种
Chain of responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template, Visitor.

Iterator

Iterators 是Python的内建模式, 可以通过了解Python iterators, generators来学习Iterators

Chain of responsibility

Chain of responsibility 举例: 设计一个网页屏蔽器, 具体屏蔽内容有: 广告, 色情内容, 等等, 可以设计如下: 通过ContentFilter来统一管理和组织不同的过滤器.

class ContentFilter(object):
    def __init__(self, filters=None):
        self._filters = list()
        if filters is not None:
            self._filters += filters

    def filter(self, content):
        for filter in self._filters:
            content = filter(content)
        return content

filter = ContentFilter([
                offensive_filter,
                ads_filter,
                porno_video_filter])
filtered_content = filter.filter(content)

Command

Command: 举例: 设计python命令行, 可以如下设计: 定义基本命令类, 然后使用History封装队列来统一处理

class RenameFileCommand(object):
    def __init__(self, from_name, to_name):
        self._from = from_name
        self._to = to_name

    def execute(self):
        os.rename(self._from, self._to)

    def undo(self):
        os.rename(self._to, self._from)

class History(object):
    def __init__(self):
        self._commands = list()

    def execute(self, command):
        self._commands.append(command)
        command.execute()

    def undo(self):
        self._commands.pop().undo()

history = History()
history.execute(RenameFileCommand('docs/cv.doc', 'docs/cv-en.doc'))
history.execute(RenameFileCommand('docs/cv1.doc', 'docs/cv-bg.doc'))
history.undo()
history.undo()

Singleton

Singleton: 保证了给定的类在运行期只有一个实例. 在Python中我们可以修改实例化的进程通过修改 __new__(), 如cls._logger存在则返回, 不存在则调用__new__

其中 cls._logger:为类变量

class Logger(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_logger'):
            cls._logger = super(Logger, cls).__new__(cls, *args, **kwargs)
        return cls._logger

python 单例模式使用有如下三种:

  • 使用一个模块
  • top-level创建app, 或者在config.py文件中
  • 直接传递实例因为,dependency injection依赖注入是一种有效的简单控制的机制

facabe

用来暴露一部分API接口, 封装的API接口给客户

Adapter

Decorator

Reference

Python design pattern

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值