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的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 一加平板电脑 OnePlus Pad 发
- 下一篇: qq炫舞刷钻石软件有哪些(PC版官方网站
