Python class 中使用@dataclass 创建的实例属性赋值
Python instance attribute assignment in class created using @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, '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']}
那么,我的做法对吗?
如果您想将 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}
我刚开始使用@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']}
那么,我的做法对吗?
如果您想将 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}