fromtypingimportProtocol, runtime_checkable @runtime_checkable# 运行时类型检查 classQuackable(Protocol): defquack(self) ->str: # 定义鸭子叫的协议方法 ... # 无需显式继承 Quackable classDuck: defquack(self) ->str: # 实现鸭子叫的具体方法...
根据isinstance的默认规则,这使得Duck1()成为DuckProtocol的实例。 Runtime-checkable协议定义它们自己的isinstance逻辑(通过实现__instancecheck__),但是如果该逻辑不能确定对象是协议的实例,那么它将通过委托给super().__instancecheck__而不是返回False来结束。经过大量的间接操作和委托之后,我们最终进入了_abc._abc_su...
由于这样的实现不是继承,所以无法在运行时使用isinstance来检查是否是基类的类型,但是python还为我们提供了@ runtime_checkable类装饰器,只要在该继承自typing.Protocol的类前加上该装饰器,就能够像继承自基类一样使用isinstance函数 from typing import Protocol, runtime_checkable @runtime_checkable class Quackable(Pr...
第二个方式是定义一个协议,然后做协议检查 from typing import runtime_checkable,Protocol @runtime_checkable class DuckLike(Protocol): """会叫的东西""" def sing(self) -> None: ... class Duck(): def sing(self): print("I am a duck") class Bird(): def sing(self): print("I am a b...
@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"...
The @runtime_checkable decorator marks a protocol class as a runtime protocol so that you can use it with isinstance() and issubclass(). Here’s how the previous example works now: Python >>> from shapes_v3 import circle, Shape >>> isinstance(circle, Shape) True After decorating your...
@runtime_checkable class SupportsComplex(Protocol): """An ABC with one abstract method __complex__.""" __slots__ = () @abstractmethod def __complex__(self) -> complex: pass 关键在于__complex__抽象方法。¹⁸ 在静态类型检查期间,如果一个对象实现了只接受self并返回complex的__complex__...
默认情况下,这只对类型检查器起作用,但如果你应用typing.runtime_checkable(),你也可以对它们执行isinstance()检查。 上节中的例子如下: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 from typingimportProtocol,runtime_checkable @runtime_checkableclassReader(Protocol):defread(self)->str:...classFooRead...
协议,自 Python 3.8 开始支持。静态协议要使用typing.Protocol子 类显式定义。 二者之间的主要区别如下。 对象可以只实现动态协议的一部分,但是如果想满足静态协议,则对象必须提供协议类中声明的每一个方法,即使程序用不到。 静态协议可以使用静态类型检查工具确认,动态协议则不能。
@runtime_checkableclass SupportsComplex(Protocol):"""An ABC with one abstract method __complex__."""__slots__ = ()@abstractmethoddef __complex__(self) -> complex:pass 关键在于__complex__抽象方法。¹⁸ 在静态类型检查期间,如果一个对象实现了只接受self并返回complex的__complex__方法,则该...