这是一个使用@runtime_checkable装饰器的示例: fromtypingimportruntime_checkable@runtime_checkableclassMyClass:defmy_method(self)->None:pass# 检查一个类是否是 MyClass 的 runtime_checkable 子类issubclass(YourSubclass,MyClass)# 返回 True 或 False# 检查一个对象是否是 MyClass 的 runtime_checkable ...
fromtypingimportProtocol, runtime_checkable @runtime_checkable# 运行时类型检查 classQuackable(Protocol): defquack(self) ->str: # 定义鸭子叫的协议方法 ... # 无需显式继承 Quackable classDuck: defquack(self) ->str: # 实现鸭子叫的具体方法...
pass 通过添加runtime_checkable装饰器来支持运行时类型检查 from typing import runtime_checkable, Protocol, Tuple @runtime_checkable class Splittable(Protocol): cost: int name: str def split_in_half(self) -> tuple['Splittable', 'Splittable']: ... class BLTSandwich: def __init__(self): se...
Python 3.8 引入了typing.Protocol类与typing.runtime_checkable装饰器,可以用来定义类型,然后在运行时对对象进行类型检查。 代码语言:javascript 复制 from typingimportProtocol,runtime_checkable from dataclassesimportdataclass @runtime_checkableclassHasName(Protocol):name:str defsay_hello(obj:HasName)->None:asse...
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_checkableclass RandomPicker(Protocol):def pick(self) -> Any: ... 注意 pick方法返回Any。在“实现通用静态协议”中,我们将看到如何使RandomPicker成为一个带有参数的通用类型,让协议的使用者指定pick方法的返回类型。
random.randrange(…)函数在范围为空时会引发ValueError,因此我们捕获并抛出LookupError,以便与Tombola兼容。 ③ 否则,随机选择的项目将从self._balls中弹出。 ④ 重写loaded以避免调用inspect(就像示例 13-7 中的Tombola.loaded一样)。通过直接使用self._balls来工作,我们可以使其更快—不需要构建一个全新的tuple。
@runtime_checkableclassReader(Protocol):defread(self)->str:...classFooReader:defread(self)->str:return"foo"assertisinstance(FooReader(),Reader) 如你所见,FooReader根本不知道Reader协议的存在! 我非常喜欢Protocol,因为它允许我完全不受干扰地定义我需要的接口,而且这个定义可以和接口的消费者共存。当你在同...
@runtime_checkableclassEatsBread(Protocol):defeat_bread(self):passclassDuck:defeat_bread(self):...isinstance(Duck(),EatsBread)# <-- True 最后一次总结, Python的Protocol的优势: 无需显式继承协议或将您的类注册为虚拟子类。 组合包不再困难:只要签名匹配,它就可以工作。
如果用户需要运行时协议,应该用 runtime_checkable() 装饰器来装饰其子类。(由 Yurii Karabas 贡献于 bpo-38908) Importing from the typing.io and typing.re submodules will now emit DeprecationWarning. These submodules have been deprecated since Python 3.8 and will be removed in a future version of ...