为什么向Type[BaseObject]类型注解的函数传子类实例时PyCharm报警告
警告触发原因
你对Type[BaseObject]注解的使用场景理解有误:
Type[BaseObject]标注的是BaseObject类本身,或者它的子类的类对象,而非类实例化之后的对象。你传入函数的long_thing、wide_thing都是LongObject、WideObject实例化生成的实例,和注解要求的类型不匹配,因此PyCharm会抛出类型不兼容警告。- 额外补充:你当前的代码逻辑是读取参数的
name属性,而name是你定义的BaseObject的实例字段,不属于类本身的属性。哪怕你强行给函数传入LongObject类对象,运行时也会抛出AttributeError,进一步说明你对参数的类型注解使用错误。
修复方案
如果你的需求是函数接收BaseObject或它的任意子类的实例,直接把参数注解修改为BaseObject即可:
# 仅修改参数注解即可消除警告,且符合代码运行逻辑 def print_object_name(obj: BaseObject): print(obj.name)
Type[BaseObject]的正确使用场景
只有当你需要把类本身作为参数传递时,才需要使用Type注解,典型场景为工厂函数:
def create_object(obj_class: Type[BaseObject], name: str, color: str, **kwargs) -> BaseObject: return obj_class(name=name, color=color, **kwargs) # 此处传入的是LongObject类本身,而非实例 new_long_obj = create_object(LongObject, "NEW_LONG", "BLUE", length=100)
内容的提问来源于stack exchange,提问作者Recently_Created_User
相关产品推荐
相关产品推荐

