fromtypingimportProtocol, runtime_checkable @runtime_checkable# 运行时类型检查 classQuackable(Protocol): defquack(self) ->str: # 定义鸭子叫的协议方法 ... # 无需显式继承 Quackable classDuck: defquack(self) ->str: # 实现鸭子叫的具体方法...
Runtime-checkable协议定义它们自己的isinstance逻辑(通过实现__instancecheck__),但是如果该逻辑不能确定对象是协议的实例,那么它将通过委托给super().__instancecheck__而不是返回False来结束。经过大量的间接操作和委托之后,我们最终进入了_abc._abc_subclasscheck,它在处理的第4步检查具体的子类,这个检查返回True。本...
@runtime_checkableclassHasName(Protocol):name:str defsay_hello(obj:HasName)->None:assertisinstance(obj,HasName),"obj must have a name attribute"print(f"Hello {obj.name}")@dataclassclassPerson:name:str @dataclassclassDog:nick:strsay_hello(Person("John"))# Hello Johnsay_hello(Dog("Bobby"...
from typing import Protocol, runtime_checkable, Any @runtime_checkable class RandomPicker(Protocol): def pick(self) -> Any: ... 注意pick方法返回Any。在“实现通用静态协议”中,我们将看到如何使RandomPicker成为一个带有参数的通用类型,让协议的使用者指定pick方法的返回类型。
自Python 2.6 开始,由抽象基类支持的方式,该方式会在运行时检查对象是否符合抽象基类的要求。大鹅类型是本章的主要话题。 静态类型 C和Java等传统静态类型语言采用的方式。自Python 3.5开始,由 typing模块支持,由符合“PEP 484—Type Hints”要求的外部类型检查 ...
@runtime_checkableclassReader(Protocol):defread(self)->str:...classFooReader:defread(self)->str:return"foo"assertisinstance(FooReader(),Reader) 如你所见,FooReader根本不知道Reader协议的存在! 我非常喜欢Protocol,因为它允许我完全不受干扰地定义我需要的接口,而且这个定义可以和接口的消费者共存。当你在同...
If you need your classes to work with isinstance() even if they’re not subclasses, then you can use the @runtime_checkable decorator in the class definition: Python shapes_v3.py from typing import Protocol, runtime_checkable @runtime_checkable class Shape(Protocol): ... The @runtime_...
重写loaded以避免调用inspect(就像示例 13-7 中的Tombola.loaded一样)。通过直接使用self._balls来工作,我们可以使其更快—不需要构建一个全新的tuple。 ⑤ 用一行代码重写inspect。 示例13-10 展示了一个值得一提的习惯用法:在__init__中,self._balls存储list(iterable)而不仅仅是iterable的引用(即,我们并没有...
make_it_quack(person) # 输出: I'm not a duck, but I can quack! 由于这样的实现不是继承,所以无法在运行时使用isinstance来检查是否是基类的类型,但是python还为我们提供了@ runtime_checkable类装饰器,只要在该继承自typing.Protocol的类前加上该装饰器,就能够像继承自基类一样使用isinstance函数 from typin...
例如,@runtime_checkable 是一个装饰器,它被用于修饰一个类,使该类可以被 isinstance 和issubclass 函数检查为 runtime_checkable。这意味着,当您使用这些函数检查对象或类时,如果它们是 @runtime_checkable 修饰的类的实例或子类,那么它们将被视为通过类型检查。 这是一个使用 @runtime_checkable 装饰器的示例: ...