You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何标注同时继承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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:12:10