首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入时调用的Dataclass (?)

导入时调用的Dataclass (?)
EN

Stack Overflow用户
提问于 2019-10-21 18:33:12
回答 2查看 363关注 0票数 1

我已经定义了这个数据类:

代码语言:javascript
复制
import logging
from config.config_parser import ConfigParser
from dataclasses import dataclass

@dataclass
class A:
    id_execution: int
    flag: bool
    log: str = logging.getLogger('log_handler')
    con: str = ConfigParser.get_conf('A', 'a_value')
    name: str = None
    surname: str = None

这个数据类在其他“传统”类中被调用,比如:

代码语言:javascript
复制
from handlers.handler_a import A
from config.config_parser import ConfigParser

# Configuration initialization
ConfigParser.initialize_config()

# Instantiate A dataclass
a = A()

ConfigParser失败,因为它没有初始化。看起来A在上面的导入中被初始化了,在configParser和所有东西之前。

这怎麽可能?我做错了什么吗?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2019-10-21 22:15:56

在创建A的过程中会调用ConfigParser.get_conf('A', 'a_value'),这就是它失败的原因。在一个普通的类中,这将被写成

代码语言:javascript
复制
class A:
    def __init__(self):
        self.con = ConfigParser.get_conf('A', 'a_value')

只有在创建实例时才会调用get_conf

我们可以通过将该属性设置为带有default_factoryfield来告诉数据类执行相同的操作

从config.config_parser导入日志记录从数据类导入ConfigParser导入数据类,字段

代码语言:javascript
复制
@dataclass
class A:
    id_execution: int
    flag: bool
    log: str = logging.getLogger('log_handler')
    con: str = field(default_factory=lambda: ConfigParser.get_conf('A', 'a_value'))
    name: str = None
    surname: str = None
票数 1
EN

Stack Overflow用户

发布于 2019-10-21 18:40:42

导入时不会初始化A,但所有这些A‘类变量都会被赋值,因此会执行像ConfigParser.get_conf('A', 'a_value')这样的右侧赋值。

如果您将这些变量设置为实例级变量(通过将其声明放在__init__中),则将在调用该a = A()时为其赋值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58484466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档