我正在使用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. Hacker(十)----常用入侵工具
  2. linux下VNC配置详解
  3. linux中redis的主从
  4. 你的工作经验到底值钱吗?
  5. 【无人机】物流行业迈入“无人”时代!全自动智能无人机投入运营,成本直降80%!...
  6. 150行java代码分析100篇英语六级阅读理解单词频率
  7. 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块
  8. Linux操作Oracle(16)——Oracle扩容报错:ORA-01144_表空间数据文件超出最大限制
  9. flutter offset_用Flutter实现58App的首页
  10. redis系列二: linux下安装redis
  11. 用手机打开word图表位置很乱_居然很多人不知?这里可以免费下载Excel可视化图表,不要错过了...
  12. 暖心!阿里安全白帽挖漏洞做公益 连收2462封山区小孩感谢信
  13. 微信小程序常用图标大全1
  14. pandas库的使用
  15. Namesilo更换域名DNS解析服务器的方法
  16. 什么是Saas,以及什么是PLG下的Saas
  17. Domino V12 Beta新玩法
  18. 完全不懂编程的人初学需要准备什么?这些就够了
  19. 个人网站备案的全流程关于阿里云
  20. VUE2 组件间传值

热门文章

  1. nacos 公共_Nacos数据模型
  2. quill鼠标悬浮 出现提示_外设报道——DELUX多彩M618X垂直鼠标颠覆创新
  3. matlab 高斯迭代代码_用Matlab编写你的第一个有限元_《数值计算与程序设计》系列课程...
  4. jenkins pipeline python_Jenkins Pipeline示例
  5. JDBC连接MySQL数据库及示例
  6. 4月11日 GCD 总结(一)
  7. Spring_Bean的作用域---和使用外部属性文件
  8. 2018年一线互联网公司Java高级面试题总结
  9. trigger 触发器(mysql)
  10. 在主界面的右下端设置系统时间