【问题标题】:How can I use a list[customClass] as type with @dataclass in Python 3.7.x如何在 Python 3.7.x 中使用 list[customClass] 作为带有 @dataclass 的类型
【发布时间】:2019-06-06 00:36:31
【问题描述】:

我有以下数据类。

@dataclass
class Package:
    '''Class for keeping track of one destination.'''
    _address: []

@dataclass
class Destination:
'''Class for keeping track of a destination.'''
_start: str
_end: str
_distance: float

def __init__(self, param):
    self._start = param[0]
    self._end = param[1]
    self._distance = param[2]

以及调用上述类的以下数据类。

@dataclass
class DestinationContainer:
    '''Class for keeping track of a package destination.
       and all the possible combinations of potential next destination '''
    _package: Package
    _destinations: List[Destination]

    def __init__(self):
        pass

    def addPkg(self,param):
        self._package = param

尝试运行程序时出现以下错误

TypeError:泛型类型的参数必须是类型。

我也尝试过以这种方式调用_destinations 成员。

_destinations: List[Destination] = field(default_factory=list)

然后我得到以下错误

TypeError:泛型类型的参数必须是类型。

我也尝试将类成员设置为

    _destinations: [] 

在检查实例对象时,类中没有可用的列表。

我也试过了。

_destinations: List = field(default_factory=lambda: [])

尝试添加到列表时出现以下错误

AttributeError: 'DestinationContainer' 对象没有属性 '_destinations'

【问题讨论】:

  • Destination 是如何定义的?该错误抱怨List[Destination],因为它认为Destination 不是一种类型。此外,您根本不应该定义自己的__init__@dataclass 将为您创建一个。如果您需要做除此之外的任何事情,您应该使用__post_init__

标签: python-3.x oop python-dataclasses


【解决方案1】:

正如 Patrick 在 cmets 中所说,您的主要问题是您在使用 @dataclass 时定义了自己的 __init__ 函数。如果您删除它并稍微重构您的代码,它应该可以按预期工作:

from dataclasses import dataclass
from typing import List

@dataclass
class Package:
    _address: List[str]

@dataclass
class Destination:
    _start: str
    _end: str
    _distance: float

@dataclass
class DestinationContainer:
    _package: Package
    _destinations: List[Destination]

    def addPkg(self, param):
        # sure this shouldn't be "self._package.append(param)"? 
        self._package = param


# works
dc = DestinationContainer(
    Package(['some address']),
    [Destination('s', 'e', 1.0)]
)
# also works
dc.addPkg(Package(['some other address']))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-21
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多