我已经定义了这个数据类:
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这个数据类在其他“传统”类中被调用,比如:
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和所有东西之前。
这怎麽可能?我做错了什么吗?
提前感谢
发布于 2019-10-21 22:15:56
在创建A的过程中会调用ConfigParser.get_conf('A', 'a_value'),这就是它失败的原因。在一个普通的类中,这将被写成
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发布于 2019-10-21 18:40:42
导入时不会初始化A,但所有这些A‘类变量都会被赋值,因此会执行像ConfigParser.get_conf('A', 'a_value')这样的右侧赋值。
如果您将这些变量设置为实例级变量(通过将其声明放在__init__中),则将在调用该a = A()时为其赋值。
https://stackoverflow.com/questions/58484466
复制相似问题