使用@dataclass

问题描述

我刚刚开始使用@dataclass装饰器。这是我没有数据类的实现

class Myclass:

    def __init__(self,path: str = None,company_name: List = None):

        self.path = path
        self.company_name = company_name

        if path is not None:
            with open(self.path,'r') as f:
                self.data = yaml.load(f,Loader=yaml.FullLoader)
        else:
            self.data = {'company': self.company_name}

所以在这里,我正在分配实例属性

c = Myclass(path = '/home/akash/project/stock-analysis/data/sample_company.yaml')
c.data
>>>{'company': ['ADANIGREEN','HDFCAMC','WHIRLPOOL','APLAPOLLO','LALPATHLAB']}

我管理的@dataclass等效项是

@dataclass
class Myclass:
    path: str=None
    company_name: List=None
        
    def __post_init__(self):
        if self.path is not None:
            with open(self.path,Loader=yaml.FullLoader)
        else:
            self.data = {'company': self.company_name}

它提供完全相同的输出(预期)

c = Myclass(path = '/home/akash/project/stock-analysis/data/sample_company.yaml')
c.data
>>>{'company': ['ADANIGREEN','LALPATHLAB']}

所以,我做对了吗?

解决方法

如果要包含data作为字段,则可以使用field(init=False)对其进行初始化,以表明其值不是__init__的参数:

from dataclasses import dataclass,field
from typing import List,Dict
import yaml

@dataclass
class Myclass:
    path: str = None
    company_name: List[str] = None
    data: Dict[str,List[str]] = field(init=False)
        
    def __post_init__(self):
        if self.path is not None:
            with open(self.path,'r') as f:
                self.data = yaml.load(f,Loader=yaml.FullLoader)
        else:
            self.data = {'company': self.company_name}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...