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

Python中如何给用作mixin的独立函数添加类型标注?

解决方案

要实现「参数同时是Base的实例、又符合Foo协议」的标注要求,分两种场景适配不同Python版本:

  • Python 3.12及以上版本
    直接用标准库typing.Intersection表达多类型交集约束即可:
    import typing
    from typing import Intersection
    from abc import ABC
    
    class Foo(typing.Protocol):
        # 注意原协议定义漏了self参数,需补上才能正确匹配实例方法
        def foo(self) -> None:
            raise NotImplementedError
    
    class Base(ABC):
        pass
    
    def free_foo(child: Intersection[Base, Foo]) -> None:
        super(child.__class__, child).foo()
    
  • Python 3.11及以下版本
    没有原生交集类型,可以自定义同时继承Base和Foo的组合协议实现同样的约束:
    import typing
    from typing import Protocol
    from abc import ABC
    
    class Foo(typing.Protocol):
        def foo(self) -> None:
            raise NotImplementedError
    
    class Base(ABC):
        pass
    
    # 自定义组合协议:只有Base的子类且符合Foo协议的实例才满足该协议约束
    class BaseFoo(Base, Foo, Protocol):
        pass
    
    def free_foo(child: BaseFoo) -> None:
        super(child.__class__, child).foo()
    

额外注意

如果你要把free_foo直接作为实例方法赋值给类属性(比如你代码中Child1.foo = free_foo的用法),可以把参数名改为self,类型检查器会自动识别为实例方法,使用体验更好:

def free_foo(self: Intersection[Base, Foo]) -> None:
    super(type(self), self).foo()

内容的提问来源于stack exchange,提问作者Stormwalker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:36:07