簡體   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