日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2023/12/15 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pythonnamedtuple定义类型_python-自定义type.NamedTuple 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我正在使用NamedTuples來(lái)保存數(shù)據(jù),并且我想添加一個(gè)可由多個(gè)基于NamedTuple的類繼承的方法.但是,當(dāng)我嘗試使用多重繼承或基于NamedTuple的類的子類化時(shí),它不起作用.具體來(lái)說(shuō),我試圖為所有數(shù)據(jù)類自動(dòng)提供一種方法,該方法可以查看類注釋,然后基于此方法調(diào)用一些序列化代碼.以下是我嘗試過(guò)的一些示例:

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

有沒(méi)有辦法讓我像這樣使用NamedTuple類?

解決方法:

有爭(zhēng)議的是通過(guò)鍵入.NamedTuple使用的元類;此元類將忽略所有基類,僅生成具有添加的注釋信息(跨直接在該類上定義的所有其他屬性進(jìn)行復(fù)制)的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

請(qǐng)注意,這不會(huì)讓您繼承字段!這是因?yàn)槟仨殲樽侄蔚娜魏谓M合生成一個(gè)新的namedtuple類.上面產(chǎn)生了以下結(jié)構(gòu):

> Test1,繼承自

> _base_Test1-實(shí)際的鍵入.NamedTuple生成namedtuple

>元組

> Base1

并按要求工作:

>>> x = Test1(1, 2)

>>> x.foo()

{'x': , 'y': }

標(biāo)簽:python-3-x,mypy,python

來(lái)源: https://codeday.me/bug/20191109/2010989.html

總結(jié)

以上是生活随笔為你收集整理的pythonnamedtuple定义类型_python-自定义type.NamedTuple的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。