【问题标题】:Python instance attribute assignment in class created using @dataclass使用 @dataclass 创建的类中的 Python 实例属性分配
【发布时间】:2021-01-13 02:40:14
【问题描述】:

我刚刚开始使用@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, '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']}

那么,我的做法是否正确?

【问题讨论】:

    标签: python python-3.x python-dataclasses python-class


    【解决方案1】:

    如果你想包含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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2016-01-09
      • 2021-07-17
      • 1970-01-01
      相关资源
      最近更新 更多