Python技术迷

Python 中的接口如何实现?

在 Python 里,“接口”这个词其实不像 Java 那样是一个专门的关键字,而是更像一种“约定”或“设计思路”。你完全可以写出不声明接口的代码,但如果团队里大家都遵循一个规范,那就能让代码更容易维护。

接口的核心思想是:定义行为,而不关心具体实现。你只需要告诉别人“这个类必须有哪些方法”,具体怎么实现,由每个类自己决定。

举个例子,如果你写了一个支付系统,不同支付方式(支付宝、微信、银行卡)可能实现方式不同,但它们都需要一个统一的方法,比如 pay(amount)。

Python 没有 interface 关键字,但有几种实现接口的常见方式。

方法一:通过抽象基类(abc 模块)

abc 是 Python 标准库里的“抽象基类”工具,可以用它来强制子类实现特定方法。

from abc import ABC, abstractmethod

classPayment(ABC):
    @abstractmethod
defpay(self, amount):
pass

classAlipay(Payment):
defpay(self, amount):
        print(f"使用支付宝支付 {amount} 元")

classWechatPay(Payment):
defpay(self, amount):
        print(f"使用微信支付 {amount} 元")

# 使用
defprocess_payment(payment: Payment, amount):
    payment.pay(amount)

process_payment(Alipay(), 100)
process_payment(WechatPay(), 200)

如果你写一个子类但没实现 pay 方法,Python 会直接报错,防止你遗漏。

方法二:用“鸭子类型”实现

Python 是动态类型语言,只要一个对象有你需要的方法,就能用它——不要求它继承自某个父类。这就是“鸭子类型”:

“像鸭子一样走路、像鸭子一样叫,那它就是鸭子。”

classAlipay:
defpay(self, amount):
        print(f"使用支付宝支付 {amount} 元")

classBitcoinPay:
defpay(self, amount):
        print(f"用比特币支付 {amount} 元")

defprocess_payment(payment, amount):
    payment.pay(amount)  # 不关心类型,只关心有 pay 方法

process_payment(Alipay(), 300)
process_payment(BitcoinPay(), 0.002)

好处是灵活,坏处是如果对象没有 pay 方法,会在运行时报错。

方法三:使用 Protocol(Python 3.8+)

typing 模块的 Protocol 可以让类型检查工具(如 mypy)帮你在写代码时就发现问题,而不是运行时才报错。

from typing import Protocol

classPaymentProtocol(Protocol):
defpay(self, amount: float) -> None: ...

classAlipay:
defpay(self, amount: float) -> None:
        print(f"支付宝支付 {amount} 元")

defprocess_payment(payment: PaymentProtocol, amount: float):
    payment.pay(amount)

process_payment(Alipay(), 88.0)

这在大型项目里尤其有用,因为它结合了接口约束和 Python 的灵活性。

  • 如果是团队协作、代码规模较大,推荐用 abc 或 Protocol 来定义接口。
  • 如果是小项目或临时代码,可以直接用鸭子类型,省去继承的麻烦。
  • 不管哪种方式,接口的核心都是**“行为契约”**,确保不同实现类之间的一致性。

如果你愿意,我可以帮你写一个带多种支付方式的接口实现案例,让 abc、鸭子类型、Protocol 三种方式在同一个项目里对比使用,这样会更直观。这样你不仅能看到它们怎么写,还能感受到它们在团队合作和项目规模不同的情况下的差异。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领