我正在使用NamedTuples来保存数据,并且我想添加一个可由多个基于NamedTuple的类继承的方法.但是,当我尝试使用多重继承或基于NamedTuple的类的子类化时,它不起作用.具体来说,我试图为所有数据类自动提供一种方法,该方法可以查看类注释,然后基于此方法调用一些序列化代码.以下是我尝试过的一些示例:

from typing import NamedTuple

class Base1:

def foo(self):

print(self.__annotations__)

class Test1(NamedTuple, Base1):

x: int

y: int

x = Test1(1, 2)

x.foo() # raises AttributeError

class Base2(NamedTuple):

def foo(self):

print(self.__annotations__)

class Test2(Base2):

x: int

y: int

x = Test2(1, 2) # TypeError: __new__() takes 1 positional argument but 3 were given

有没有办法让我像这样使用NamedTuple类?

解决方法:

有争议的是通过键入.NamedTuple使用的元类;此元类将忽略所有基类,仅生成具有添加的注释信息(跨直接在该类上定义的所有其他属性进行复制)的collections.namedtuple()类.

您可以定义自己的元类(必须是type.NamedTupleMeta的子类),在生成命名的元组类后添加其他基类:

import typing

class MultipleInheritanceNamedTupleMeta(typing.NamedTupleMeta):

def __new__(mcls, typename, bases, ns):

if typing.NamedTuple in bases:

base = super().__new__(mcls, '_base_' + typename, bases, ns)

bases = (base, *(b for b in bases if not isinstance(b, typing.NamedTuple)))

return super(typing.NamedTupleMeta, mcls).__new__(mcls, typename, bases, ns)

class Base1(metaclass=MultipleInheritanceNamedTupleMeta):

def foo(self):

print(self.__annotations__)

class Test1(NamedTuple, Base1):

x: int

y: int

请注意,这不会让您继承字段!这是因为您必须为字段的任何组合生成一个新的namedtuple类.上面产生了以下结构:

> Test1,继承自

> _base_Test1-实际的键入.NamedTuple生成namedtuple

>元组

> Base1

并按要求工作:

>>> x = Test1(1, 2)

>>> x.foo()

{'x': , 'y': }

标签:python-3-x,mypy,python

来源: https://codeday.me/bug/20191109/2010989.html

pythonnamedtuple定义类型_python-自定义type.NamedTuple相关推荐

  1. pythonnamedtuple定义类型_python - namedtuple和可选关键字参数的默认值

    python - namedtuple和可选关键字参数的默认值 我正在尝试将一个冗长的空洞"数据"类转换为一个命名元组. 我的班级目前看起来像这样: class Node(obje ...

  2. pythonnamedtuple定义类型_python namedtuple的使用

    首先,我会介绍下使用namedtuple所需要了解的基本概念,然后讲解如何使用namedtuple,最后使用namedtuple来创建一摞纸牌.理解这些之后,就可以权衡利弊,并在生产中使用 基本概念 ...

  3. pythonnamedtuple定义类型_详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...

  4. python定义词典_python – 自定义类是一个字典,但初始化没有字典副本?

    出于易读性的目的,我希望有一个自定义类,其行为与dict完全相同(但是带有有意义的类型,而不是更通用的dict类型): class Derivatives(dict): "Dictionar ...

  5. python中object是什么类型_Python 的 type 和 object 之间是怎么一种关系?

    class,metaclass,instance,subclass,base 以下成立: 对任意的A,A是instance(推论:任意class也是instance) 对任意A,存在B,使得B是A的c ...

  6. 在python中使用关键字define定义函数_python自定义函数def的应用详解

    这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...

  7. python中函数type可以测试对象类型_Python中type函数type()显示对象的类型,dir函数dir()显示的是对象可用的方法。_学小易找答案...

    [判断题]new_word = word.upper() 这一语句表示将word这个变量的值全部小写并赋给新变量new_word. [单选题]All of the students have fini ...

  8. python中函数type可以测试对象类型_python类型检测最终指南--Typing模块的使用

    正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...

  9. oracle自定义的记录类型,oracle 自定义类型 type / create type

    一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...

最新文章

  1. 中科院自动化所介绍深度强化学习进展:从AlphaGo到AlphaGo Zero
  2. (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
  3. POJ1087DFS+匈牙利或者DINIC
  4. yunyang1994 tensorflow_yolov3 ./checkpoint/yolo3_coco_demo.ckpt does not exist !!! Now it starts to
  5. C语言 数组遍历 - C语言零基础入门教程
  6. js 延迟几秒执行ifarme_Node.js调试之llnode篇
  7. 数据文件坏删除数据文件
  8. oracle asm 错误集
  9. 锻炼编程思维的小题目
  10. 计算机辅助翻译软件差异,两款计算机辅助翻译软件的比较
  11. 在苹果笔记本如何使用python_苹果电脑系统如何运行python工具介绍
  12. 卡方线性趋势检验_趋势性卡方检验专题讨论
  13. pip安装的依赖不在虚拟环境中
  14. go之官方依赖管理工具dep安装和使用
  15. FPGA——1位全加器和4位全加器的实现
  16. Python爬虫js处理
  17. 基于深度学习的几何模型表示 分析与合成
  18. 小迪迪QQ机器人框架+源码
  19. 迅捷CAD编辑器是不错的PDF转换CAD软件
  20. html右移动动画效果,图片的左右移动,js动画效果实现代码

热门文章

  1. java MySQL mq_蚂蚁社招Java岗面试分享(MySQL+RabbitMQ+Spring Boot)
  2. excel appliacation 不能分配角色_用了5年Excel,换了这个神奇的报表工具,不禁感叹:国产真香...
  3. Qt的qrc资源文件在Visual studio编译出的Qt程序中不能显示问题解决
  4. Android自定义控件之自定义时钟
  5. java怎么获取ajax_Java学习路线
  6. (笔记)java环境变量设置
  7. 《SAP HANA平台应用开发》—第2章2.3节熟悉SAP HANA工作台
  8. CodeForces 525C Ilya and Sticks 贪心
  9. 系统的crontab设定:/etc/crontab
  10. 巧用PowerShell维护Win2008服务器作业