如何标注同时继承Camera类并实现Supports_connect协议的对象类型?
解决方案
要定义同时继承Camera类并实现Supports_connect协议的类型标注,可根据Python版本选择两种实用方式:
方式一:Python 3.10+ 原生交集类型
Python 3.10及以上支持交集类型(&运算符),能直接将类与协议组合作为类型标注,写法简洁直观:
from typing import Protocol, abstractmethod class Supports_connect(Protocol): address: int @abstractmethod def connect(self) -> None: ... class Camera: pass # 实际业务实现 def connect_cameras(device: Camera & Supports_connect) -> None: device.connect() print(f"已连接到地址为 {device.address} 的摄像头")
Camera & Supports_connect表示参数必须同时满足两个条件:是Camera的实例,且实现了Supports_connect协议的所有属性与方法。
方式二:自定义组合协议(兼容Python 3.9及更早版本)
若需兼容旧版Python,可定义一个新的组合协议,同时继承Camera与Supports_connect:
from abc import abstractmethod from typing import Protocol class Supports_connect(Protocol): address: int @abstractmethod def connect(self) -> None: ... class Camera: pass # 实际业务实现 # 定义组合协议,要求同时满足Camera子类和Supports_connect协议 class CameraWithConnect(Camera, Supports_connect, Protocol): pass def connect_cameras(device: CameraWithConnect) -> None: device.connect() print(f"已连接到地址为 {device.address} 的摄像头")
CameraWithConnect会自动校验传入对象:既是Camera的实例,又实现了Supports_connect的全部要求。
验证示例
创建符合要求的子类测试:
class NetworkCamera(Camera): def __init__(self, address: int): self.address = address def connect(self) -> None: print(f"正在连接网络摄像头 {self.address}") # 合法调用,通过类型检查 connect_cameras(NetworkCamera(19216801)) # 以下情况会触发类型检查报错: # 1. 仅继承Camera但未实现Supports_connect class BasicCamera(Camera): pass connect_cameras(BasicCamera()) # 类型检查器提示不符合要求 # 2. 仅实现Supports_connect但不是Camera子类 class NonCameraDevice: def __init__(self, address: int): self.address = address def connect(self) -> None: pass connect_cameras(NonCameraDevice(123)) # 类型检查器提示不符合要求
内容的提问来源于stack exchange,提问作者MPEI_stud
相关产品推荐
相关产品推荐

