18

我最近开始使用数据类,它们将是 3.7 的一个很好的补充。我很好奇是否或如何使用数据类重新创建此类的相同功能。

class Nav(object):
    def __init__(self, name:str, menu, page, *submenus):
        self.name = name
        self.menu = menu
        self.page = page
        self.submenus = submenus

foo = Nav("name", "menu", "page")

这行不通。引发异常TypeError: __init__() missing 1 required positional argument: 'submenus'

@dataclass
class Nav(object):
    name:str
    menu: Any
    page: Any
    submenus: tuple

foo = Nav("name", "menu", "page")

我认为这是因为该类没有解包参数的说明。 有什么方法可以指示数据类装饰器需要解压缩子菜单吗?

4

1 回答 1

9

我在PEP中看到了如何覆盖__init__.

有时生成的init方法是不够的。例如,假设您想要一个对象来存储 *args 和 **kwargs:

@dataclass(init=False)
class ArgHolder:
    args: List[Any]
    kwargs: Mapping[Any, Any]

    def __init__(self, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs

a = ArgHolder(1, 2, three=3)
于 2018-06-08T16:35:52.823 回答