繁体   English   中英

导入时调用的数据类(?)

[英]Dataclass being invoked when import (?)

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

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

此数据类正在其他“传统” class 中调用,例如:

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 和所有内容之前。

这怎么可能? 难道我做错了什么?

提前致谢

A在导入时没有被初始化,但是所有那些 A' class 变量都被赋值,所以像ConfigParser.get_conf('A', 'a_value')这样的赋值右侧被执行。

如果您使这些变量成为实例级变量(通过将它们的声明放在__init__中),它们将在调用a = A()时被分配。

ConfigParser.get_conf('A', 'a_value')在创建A期间被调用,这就是它失败的原因。 在普通的 class 中,会这样写

class A:
    def __init__(self):
        self.con = ConfigParser.get_conf('A', 'a_value')

并且get_conf只会在创建实例时被调用。

我们可以通过使该属性成为具有default_factoryfield来告诉数据类做同样的事情:

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

@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM