pythonnamedtuple定义类型_python-自定义type.NamedTuple
我正在使用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)題。
- 上一篇: 一加平板电脑 OnePlus Pad 发
- 下一篇: python 浏览器,轻量级Python