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
相关产品推荐
相关产品推荐

