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 全部免费领