首页 > 编程问答 >Python:指定与继承一起使用的类方法的返回类型

Python:指定与继承一起使用的类方法的返回类型

时间:2024-07-30 14:12:13浏览次数:13  
标签:python inheritance python-typing class-method

我一直在尝试了解如何在 Python 中指定类方法的返回类型,以便即使对于子类也能正确解释它(例如在我的 Sphinx 文档中)。

假设我有:

class Parent:

    @classmethod
    def a_class_method(cls) -> 'Parent':
        return cls()


class Child(Parent):
    pass

什么如果我希望父级为 a_class_method ,子级为 Parent ,我应该指定为 Child 的返回类型吗?我也尝试过 __qualname__ ,但这似乎也不起作用。我应该不注释返回类型吗?

提前致谢!


遇到的问题是正在尝试使用 Python 的类型提示来执行 Python 通常不支持的操作: 运行时类型信息,用于调度行为 。类型提示主要用于静态分析和在运行时很大程度上被忽略。

以下是可以解决此问题的几种方法:

1. 使用 TypeVar 进行泛型行为(推荐)

```python from typing import TypeVar

T = TypeVar('T', bound='Parent')

class Parent: @classmethod def a_class_method(cls: type[T]) -> T: return cls()

class Child(Parent): pass

reveal_type(Parent.a_class_method()) # 显示 "Parent" reveal_type(Child.a_class_method()) # 显示 "Child" `` 这允许类型检查器理解 a_class_method` 应该返回与其调用它的类相同的类型。

2. 文档,而不是依赖于代码中的精确类型

```python class Parent: @classmethod def a_class_method(cls) -> 'Parent': """返回此类的实例。

       Returns:
           Parent 的一个实例:此类的实例,可能是子类。
       """
       return cls()

class Child(Parent): pass ```

在这种情况下,接受类型提示对于子类不会完全准确,而是在文档中解释该方法的行为。

其他注意事项:

  • Python 中的类型提示不是为了在运行时强制执行而设计的。 它们主要用于静态分析工具(如 MyPy)以及提高代码清晰度。
  • __qualname__ 用于获取成员的限定名称, 并且不会改变返回类型的行为。

总的来说,使用 TypeVar 是最准确地表示 a_class_method 行为的类型安全方法。但是,请记住,Python 中的类型提示主要用于静态分析,而不是运行时类型检查。

标签:python,inheritance,python-typing,class-method
From: 61535224

相关文章

  • python使用SMTP功能发送邮件
    网页格式发送for_email.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>h1{color:brown;}p{margin:5px;color:purple......
  • python之代码简化式(列表、字典生成式,递归函数,迭代器(iter)和生成器(yield)、匿名函数(
    文章目录前言1、列表、字典生成式2、递归函数2.1python中代码的递归深度(扩展)3、拓展:迭代器和生成器3.1迭代器(iter)3.2生成器(yield)4、匿名函数(lambda)4.1map函数4.2reduce函数(较少使用)4.3filter函数前言本文主要讲解一些简化代码格式的一些方法,方便大家更好的......
  • Python:在 Protocol 和 TypedDict 之间共享类型注释
    举这个简单的例子:from__future__importannotationsimporttypingastclassMyType:def__init__(self,s:str,i:int)->None:self.s=sself.i=iclassMyProto(t.Protocol):s:stri:intclassMyDict(t.TypedDict):......
  • PIL 和 python 静态类型
    我有一个函数参数,它可以接受图像的多种类型:defsomefunc(img:Union[np.array,Image,Path,str]):PILImage在这种情况下抛出以下异常:TypeError:Union[arg,...]:eachargmustbeatype.Got<module'PIL.Image'from...进一步检查图像对象后这才有......
  • 学会用Python爬取小说网站,想看什么就爬什么,广告也不用看了~
    今天以爬取笔趣阁小说网站为例,练习Python爬虫技术。通过这个爬虫,可以完成批量爬取一本小说的所有章节,并将所有章节内容按顺序保存到一个txt文档内,下面我们就开始吧。首先,百度搜索“笔趣阁”,发现有很多网站都叫笔趣阁。我们可以随便挑选一个网站尝试,本文我以‘https://......
  • 计算机毕业设计django+vue《Python数据分析》的教学系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今数字化时代,数据分析已成为各行各业不可或缺的技能之一,而Python作为数据分析领域的首选语言,其重要性日益凸显。然而,传统的教学模式在......
  • 如何将多个变量分配给 python 函数中的单个参数?
    我正在尝试编写一个程序,如果可能的话,它需要一个三项式并对其进行因式分解。每当用户输入A、B和C时,三项式应该通过Factor(product,summation)函数获取,但我似乎无法弄清楚如何将A和C分配给乘积arg,将B分配给我尝试在函数外部声明不同的变量,product=(a*c)和summati......
  • python - 从文本生成音乐
    请给我一些建议为了解释一下,我输入“深度睡眠的睡眠音乐”,它将返回一个wav文件:https://www.youtube.com/watch?v=1wAdQhFJy54或者我给出一个wav文件,它会返回相同的现在这是我尝试过的:https://github.com/facebookresearch/audiocraft......
  • 从零开始的Python开发日记(7):短信验证功能开发流程
    短信验证功能开发流程在开发一个包含登录、注册以及短信验证的功能时,你需要遵循一个系统的开发流程。以下是实现这一功能的基本步骤,包括所需的技术和代码示例。1.环境配置首先,确保你的开发环境已经配置好,并安装了必要的库和工具。pipinstallfastapiuvicornsqlalche......
  • 【Python数值分析】革命:引领【数学建模】新时代的插值与拟合前沿技术
    目录​编辑第一部分:插值的基本原理及应用1.插值的基本原理1.1插值多项式1.2拉格朗日插值 1.3牛顿插值 1.4样条插值2.插值的Python实现2.1使用NumPy进行插值2.2使用SciPy进行插值2.2.1一维插值​编辑2.2.2二维插值3.插值的应用场景3.1数据平......