Python自定义接口,也能玩得这么花

目录

1、经典方案:抽象基类 🧱

1.1 介绍Python抽象基类

1.2 实现接口的步骤

1.3 应用场景与优势分析

2、现代风格:协议(Protocols) 📜

2.1 Python 3.8+新特性

2.2 使用typing模块定义协议

2.3 协议与类型检查

3、装饰器定义接口 🎨

3.1 创建接口装饰器

3.2 应用装饰器实现接口

3.3 动态添加接口约束

4、接口继承与多重继承:传统而实用 🧑‍🏫

4.1 基类定义接口规范

4.2 多重继承实现复杂接口

5、使用Zope Interface库:第三方解决方案 🌐

5.1 Zope Interface简介

5.2 定义与实现接口的步骤

6、总结与展望:接口设计的艺术 🎨



1、经典方案:抽象基类 🧱

1.1 介绍Python抽象基类

在Python中,抽象基类(Abstract Base Class,简称ABC)是一种特殊形式的类,用于定义接口规范,即一组方法的声明,但不提供具体实现。它允许子类继承并强制要求实现这些抽象方法。Python通过abc模块提供了对抽象基类的支持,这对于设计框架和定义接口标准非常有用。

1.2 实现接口的步骤

要使用抽象基类定义接口,遵循以下步骤:

1. 导入abc模块:首先,需要从标准库导入abc模块。

from abc import ABC, abstractmethod

  1. 2. 定义抽象基类:使用class关键字定义类 ,并继承自ABC

  2. 3. 声明抽象方法:在类内部使用@abstractmethod装饰器标记那些需要子类实现的方法。

下面是一个简单的例子,定义了一个Shape抽象基类 ,其中calculate_area是一个抽象方法:

class Shape(ABC):
    @abstractmethod
    def calculate_area(self):
        pass
  1. 1. 实现抽象基类:创建具体类时,继承自抽象基类 ,并实现所有抽象方法。

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def calculate_area(self):
        return self.width * self.height

1.3 应用场景与优势分析

应用场景

  • • 设计模式中的模板方法模式,定义算法的骨架 ,而将一些步骤延迟到子类中。

  • • 构建可扩展的框架,确保组件遵循特定接口规范。

  • • 类型检查和鸭子类型编程 ,通过抽象基类作为类型提示。

优势

  • • 规范性:确保了接口的一致性 ,所有实现该接口的子类都必须遵循相同的方法签名。

  • • 灵活性:便于后续扩展和修改 ,无需改动已有的实现,符合开闭原则。

  • • 代码复用:抽象基类可以包含具体实现,减少代码重复。

  • • 易于测试:可以通过模拟(Mocking)抽象基类来测试依赖于接口的代码 ,而不必关注具体实现。

通过上述介绍 ,可以看到抽象基类是Python中实现接口规范的一种强大而灵活的方式 ,尤其适用于构建高度解耦、可扩展的系统设计。

2、现代风格:协议(Protocols) 📜

2.1 Python 3.8+新特性

自从Python 3.8版本起,引入了一项重要特性——协议(Protocol),它是typing模块中的一个核心概念。协议类似于其他面向对象语言中的接口,但更加灵活和动态。它利用Python的鸭子类型哲学 ,允许你定义一组方法的集合,任何实现了这些方法的对象都可以被视为遵循了这个协议,即便它们并没有显式声明。

2.2 使用typing模块定义协议

要定义一个协议,可以使用typing.Protocol类。下面展示如何定义一个简单的Drawable协议,要求对象实现draw()方法:

from typing import Protocol

class Drawable(Protocol):
    def draw(self) -> None:
        ...

在这个例子中,Drawable协议定义了一个draw方法,任何实现了draw方法的类就自动遵循了这个协议 ,无须直接继承或显式声明。

2.3 协议与类型检查

协议的一个主要用途是在类型注解中,用于静态类型检查。这使得IDE和类型检查器如mypy能够识别出哪些对象符合特定的协议,从而提供更强大的代码补全和错误检

  • 25
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中,可以通过几种方式自定义损失函数。其中一种方法是直接使用PyTorch中的函数接口Python内建的方法来定义。在这种方法中,你可以定义一个继承nn.Module的类,重写该类的__init__()和forward()方法。在__init__()方法中,你可以初始化超参数;在forward()方法中,你可以定义损失的计算方式,并进行前向传播。例如,你可以使用torch.mean()函数计算损失的均值,使用torch.pow()函数计算预测值和标签之间的差的平方。你也可以使用torch.clamp()函数来对损失进行裁剪。最后,返回计算得到的损失值。以下是一个示例代码: ```python import torch import torch.nn as nn import torch.nn.functional as func class MyLoss(nn.Module): def __init__(self, param1): super(MyLoss, self).__init__() self.param1 = param1 def forward(self, predict, label): loss = torch.mean(torch.pow((predict - label), 2)) return loss ``` 另一种方法是扩展PyTorch库中已有的损失函数类。你可以定义一个继承nn.Module的类,并重写该类的__init__()和forward()方法。在__init__()方法中,你可以初始化超参数;在forward()方法中,你可以根据自定义的计算方式来计算损失,并返回损失值。这种方法可以方便地使用PyTorch提供的数学函数,如torch.clamp()和torch.pairwise_distance()。以下是一个示例代码: ```python import torch import torch.nn as nn import torch.nn.functional as func class TripletLossFunc(nn.Module): def __init__(self, t1, t2, beta): super(TripletLossFunc, self).__init__() self.t1 = t1 self.t2 = t2 self.beta = beta def forward(self, anchor, positive, negative): matched = torch.pow(func.pairwise_distance(anchor, positive), 2) mismatched = torch.pow(func.pairwise_distance(anchor, negative), 2) part_1 = torch.clamp(matched - mismatched, min=self.t1) part_2 = torch.clamp(matched, min=self.t2) dist_hinge = part_1 + self.beta * part_2 loss = torch.mean(dist_hinge) return loss ``` 这些方法都可以在自定义损失函数时使用,具体选择哪种方法取决于你的需求和个人偏好。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [PyTorch自定义损失函数](https://blog.csdn.net/weixin_43424482/article/details/118709610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [pytorch基础使用—自定义损失函数](https://blog.csdn.net/weixin_51691064/article/details/130138001)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图灵学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值