fromtypingimportProtocol, runtime_checkable @runtime_checkable# 运行时类型检查 classQuackable(Protocol): defquack(self) ->str: # 定义鸭子叫的协议方法 ... # 无需显式继承 Quackable classDuck: defquack(self) ->str: # 实现鸭子叫的具体方法...
例如,@runtime_checkable 是一个装饰器,它被用于修饰一个类,使该类可以被 isinstance 和issubclass 函数检查为 runtime_checkable。这意味着,当您使用这些函数检查对象或类时,如果它们是 @runtime_checkable 修饰的类的实例或子类,那么它们将被视为通过类型检查。 这是一个使用 @runtime_checkable 装饰器的示例: ...
Python 3.8 引入了typing.Protocol类与typing.runtime_checkable装饰器,可以用来定义类型,然后在运行时对对象进行类型检查。 代码语言:javascript 代码运行次数:0 运行 AI代码解释 from typingimportProtocol,runtime_checkable from dataclassesimportdataclass @runtime_checkableclassHasName(Protocol):name:str defsay_hell...
12. 协议和结构化类型(Duck Typing) fromtypingimportProtocol, runtime_checkable @runtime_checkable classSupportsClose(Protocol): def close(self) ->None: ... def close_all(items:list[SupportsClose]) ->None: for item in items: item.close() 13. 装饰器高级用法 # 带参数的装饰器 defrepeat(num...
@runtime_checkable class Sized(Protocol, metaclass=ABCMeta): @abstractmethod def __len__(self) -> int: ... 只要实现了__len__方法的,都加做Sized 联想 所谓的鸭子类型,在其他语言里面,其实就是接口。只是说python没有接口这个概念,为了做类型检查,才引入这一套。
Runtime-checkable协议定义它们自己的isinstance逻辑(通过实现__instancecheck__),但是如果该逻辑不能确定对象是协议的实例,那么它将通过委托给super().__instancecheck__而不是返回False来结束。经过大量的间接操作和委托之后,我们最终进入了_abc._abc_subclasscheck,它在处理的第4步检查具体的子类,这个检查返回True。
@runtime_checkableclassReader(Protocol):defread(self)->str:...classFooReader:defread(self)->str:return"foo"assertisinstance(FooReader(),Reader) 如你所见,FooReader根本不知道Reader协议的存在! 我非常喜欢Protocol,因为它允许我完全不受干扰地定义我需要的接口,而且这个定义可以和接口的消费者共存。当你在同...
from typing import Protocol, runtime_checkable, Any @runtime_checkable class RandomPicker(Protocol): def pick(self) -> Any: ... 注意pick方法返回Any。在“实现通用静态协议”中,我们将看到如何使RandomPicker成为一个带有参数的通用类型,让协议的使用者指定pick方法的返回类型。
from typing import Protocol, runtime_checkable, Any @runtime_checkable class RandomPicker(Protocol): def pick(self) -> Any: ... 注意 pick方法返回Any。在“实现通用静态协议”中,我们将看到如何使RandomPicker成为一个带有参数的通用类型,让协议的使用者指定pick方法的返回类型。 示例13-19。randompick_te...
在SupportsAbs的定义中,感谢@runtime_checkable,这是一个有效的运行时断言。 ⑤ 剩下的代码都通过了 Mypy 检查和运行时断言。 ⑥ int类型也与SupportsAbs一致。根据typeshed,int.__abs__返回一个int,这与is_unit类型提示中为v参数声明的float类型参数一致。