[英]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_factory
的field
来告诉数据类做同样的事情:
从 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.