日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

pythonnamedtuple定义类型_python-自定义type.NamedTuple

發布時間:2023/12/15 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pythonnamedtuple定义类型_python-自定义type.NamedTuple 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我正在使用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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。