首页 > 编程语言 >python类型标注self

python类型标注self

时间:2023-08-16 16:47:36浏览次数:37  
标签:__ python items self Queue item def 标注

起因

假设有如下代码,我想标注类方法的返回值为自己本身

class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item) -> Queue:
        self.items.append(item)
        return self

Queue来标注返回值类型,但是呢,运行时Python会报错

Traceback (most recent call last):
  ...
NameError: name 'Queue' is not defined

这说明,自定义的类里不能用该类名来作为类型标注

解决方法一:用typing的Self(注意大写)--首选

try:
    from typing import Self             # python3.11只后
except:
    from typing_extensions import Self  # Python3.11以前
    
class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item) -> Self:  # 使用Self替换Queue
        self.items.append(item)
        return self

这样就没有问题了,而且Self更能体现返回自身

当然,Self代表了自定义的这个类,不是说只有return self才能用它

这个方法作为首选就是因为其它方法或多或少有点问题

解决方法二:用typing的TypeVar(注意大写)

from typing import TypeVar  # 或从typing_extensions导入

# 实例化一个TypeVar并绑定类型
TQueue = TypeVar('TQueue', bound='Queue')  # 第一个参数name随意,bound绑定我们的类
    
class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item) -> TQueue:  # 使用实例化的TQueue
        self.items.append(item)
        return self

该方法和前面相比

  • 要自己实例化一个类,麻烦
  • 有些IDE可能解析不了

解决方法三:用内置__future__模块

from __future__ import annotations  # 注意要写在代码最前面来配置解析规则

class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item) -> Queue:  # 可以直接使用自定义的类
        self.items.append(item)
        return self

这个看似最好最方便,但是如果是继承类的话,它会识别不了,而识别成基类,就会有问题,所以反而不推荐这个方法

原文链接:https://realpython.com/python-type-self/

标签:__,python,items,self,Queue,item,def,标注
From: https://www.cnblogs.com/faf4r/p/17635465.html

相关文章

  • python中自定义类对象json字符串化的方法
    1.用json或者simplejson就可以2.定义转换函数:defconvert_to_builtin_type(obj):print'default(',repr(obj),')'#把MyObj对象转换成dict类型的对象d={}d.update(obj.__dict__)returnd 3.定义类classObject():name=""size=0def__init__(......
  • python不同包之间调用提示不存在
     python不同包之间调用提示不存在 在file-setting-project-projectSources,把包放入到Sources中 再次查看,正常 ......
  • 常用文件读取(python)
    CSV文件CSV(Comma-SeparatedValues)是一种常见的文本文件格式,用于存储结构化的数据。CSV文件中的数据是以逗号(或其他指定的分隔符)分隔的文本行,每一行表示一条记录,每个字段表示记录中的一个属性或值。读CSVimportcsvimportcodecsfile_name=""withopen(file_name,"r",en......
  • 计数排序(Python)
    defcounting(data):"data里的value作为计数数组counts的index,然后把counts的value转换成data的index"#计数列表,存储每个值有多少个,以data的值作为索引,所以数组长度以最大值+1为准counts=[0foriinrange(max(data)+1)]#同时给数组赋初值0,等会逐个计数......
  • if语句条件判断大集合--------------------------------------python语言学习
    准备数据: ##实现成绩大于等于600为优秀,其他为普通等级上代码:importpandasaspddf=pd.read_excel('C:/Users/Administrator/Desktop/test1.xlsx',header=1)defscore_if(score):ifscore>=600:a="优秀"returnaelse:a="普通"......
  • python编程从入门到实践(第2版)学习笔记(变量,字符串)
    变量变量是一种可以赋给值的标签。每一个变量都指向一个相关联的值,下列代码中message即为变量,指向的值为“HelloPythonworld!”message="HelloPythonworld!"print(message)第二行的print()函数用于打印输出这个message变量所关联的值。且变量的值是可以修改的,p......
  • python操作SQLite数据库
    1、脚本#!/usr/local/python3.8/bin/python3#-*-coding:UTF-8-*-importsqlite3importredefdict_factory(cursor,row):#将游标获取的数据处理成字典返回#cursor.description:获取表头d={}foridx,colinenumerate(cursor.description):......
  • python+selenium(windows10) 安装
    1.安装python2. 安装selenium(piplist查看是否已安装)2.1 cmd窗口输入:pip(如果有内容显示,说明正常)        2.2 cmd输入指令安装selenium:pipinstallselenium==* .**.**( 也可以不指定版本)【如果安装中途断了,重新安装即可,不影响效果】 ......
  • python第七天
    一、元组(tuple)元组:元组的排列是有顺序的,可以进行切片,元组的数据不可以进行修改建议:元组在写的时候在最后加逗号(,),以区分参数数据例:tu=(111,"alex",(11,22),[(33,44)],True,22,33,44,)元组相当于对列表的二次加工元组具有2条功能count和index1、count对元组的指定数据进......
  • Python 如何自动遍历文件下所有的文件,然后再对每一个文件夹读取里面的csv文件
    Python如何自动遍历文件下所有的文件,然后再对每一个文件夹读取里面的csv文件:代码:importosimportcsv#设置要遍历的文件夹路径folder_path="your_folder_path"#遍历文件夹forroot,dirs,filesinos.walk(folder_path):#遍历当前文件夹下的所有文件for......