关于PEP 544中显式子类化协议却未实现的疑问
关于PEP 544中显式子类化协议却未实现的疑问
嘿,我来给你掰扯清楚PEP 544里这个有点绕的细节!
首先得铺垫下:PEP 544引入的「协议(Protocol)」主要是给静态类型检查用的——一般来说,要么你的类实现了协议要求的所有属性/方法,要么你显式继承这个协议,类型检查器都会认为你的类符合该协议的要求。但原文提到的是个例外情况:就算你显式子类化了某个协议,只要你把协议里要求的某个属性直接赋值为None,这个子类依然不会被视为实现了该协议。
举个具体的代码例子就好懂了:
先定义一个简单的协议,要求类必须有一个int类型的属性required_attr:
from typing import Protocol class MyProtocol(Protocol): required_attr: int # 协议明确要求这个属性的类型是int
如果是正常实现,显式继承后给属性赋值符合类型的值,类型检查器会认可:
class ValidImpl(MyProtocol): required_attr = 42 # 赋值int类型,符合协议要求
但如果像下面这样,显式继承协议后把要求的属性设为None:
class InvalidImpl(MyProtocol): required_attr = None # 把协议要求的属性直接设为None
这时候,虽然InvalidImpl显式继承了MyProtocol,但类型检查器会判定它没有实现该协议。原因很简单:协议要求required_attr是int类型,而None的类型是NoneType,和要求的类型不匹配。而且根据Python数据模型的规则,这种直接将协议属性赋值为None的操作,不会被类型检查器视为有效的协议实现——哪怕你显式写了继承关系。
简单来说,这个规则是在提醒你:显式继承协议不代表“一劳永逸”,如果你的子类里把协议要求的核心属性直接设为None,依然会被判定为不符合协议要求。
备注:内容来源于stack exchange,提问作者Fang Hung-chien
相关产品推荐
相关产品推荐

