【问题标题】:Python 3.7: Initialize objects with dataclasses module?Python 3.7:使用数据类模块初始化对象?
【发布时间】:2018-07-12 19:19:37
【问题描述】:

这是我在 python 3.6 中的代码

class A(object)

    def __init__(self, a: str):
        self._int_a: int = int(a)  # desired composition

    def get_int_a(self) -> int:
        return self._int_a   

我想重写python 3.7中的这段代码,我该如何用dataclasses模块初始化self._int_a: int = int(a)

我知道我可以做类似的事情,但我不知道如何初始化 _a: int = int(a) 或类似的东西。

from dataclasses import dataclass


@dataclass
class A(object):
    _a: int = int(a)  # i want to get initialized `int` object here

def get_int_a(self) -> int:
    return self._a

提前感谢您的想法和建议。

【问题讨论】:

    标签: python python-3.7 python-dataclasses


    【解决方案1】:

    完全摒弃 getter 和 setter,只使用属性访问。我们可以定义一个接受字符串的init only field,然后在我们的__post_init__ 调用中将该字符串转换为整数字段。

    from dataclasses import dataclass, InitVar, field
    
    @dataclass
    class A:
        temp: InitVar[str]
        a: int = field(init=False)
        def __post_init__(self, temp):
            self.a = int(temp)
    
    x = A("1")
    print(type(x.a), x.a)
    # <class 'int'> 1
    

    【讨论】:

    • 我无法理解的机制是,最后,temp 仍然作为最终对象的字段...数据类机制应该将其完全从字段中删除(原样在调用模块级 fields 方法时完成,但在 __dataclass_fields__ 中没有完成。
    • 我不确定我明白你在说什么。 x.temp 应该导致 AttributeError
    • 确实,我很困惑,它导致了一个 AttributeError 正如预期的那样。
    • 好的,现在我明白了问题所在:想象同样的例子,但现在在类定义中给 temp 一个默认值。现在你没有 AttributeError,这很奇怪。
    • 好的,但这会破坏关键字初始化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多