[英]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.