Skip to main content
 首页 » 编程设计

python之无需通过 __setattr__ 创建类属性

2025年05月04日9bjzhanghao

下面是我制作的一个类,可以轻松地将一堆数据存储为属性。 他们最终被存储在字典中。 我重写了 __getattr__ 和 __setattr__ 以不同类型的单位存储和检索值。 当我开始覆盖 __setattr__ 时,我在 __init__ 的第 2 行创建初始字典时遇到了问题,就像这样......

super(MyDataFile, self).__setattr__('_data', {})

我的问题... 是否有更简单的方法通过 __setattr__ 创建类级别的属性? 另外,我应该关心保留一个单独的字典还是应该将所有内容都存储在 self.__dict__ 中?

#!/usr/bin/env python 
 
from unitconverter import convert 
import re 
 
special_attribute_re = re.compile(r'(.+)__(.+)') 
 
class MyDataFile(object): 
 
    def __init__(self, *args, **kwargs): 
        super(MyDataFile, self).__init__(*args, **kwargs) 
        super(MyDataFile, self).__setattr__('_data', {}) 
 
    # 
    # For attribute type access 
    # 
    def __setattr__(self, name, value): 
        self._data[name] = value 
 
    def __getattr__(self, name): 
 
        if name in self._data: 
            return self._data[name] 
 
        match = special_attribute_re.match(name) 
        if match: 
            varname, units = match.groups() 
            if varname in self._data: 
                return self.getvaras(varname, units) 
 
        raise AttributeError 
 
    # 
    # other methods 
    # 
    def getvaras(self, name, units): 
        from_val, from_units = self._data[name] 
        if from_units == units: 
            return from_val 
        return convert(from_val, from_units, units), units 
 
    def __str__(self): 
        return str(self._data) 
 
 
 
d = MyDataFile() 
 
print d 
 
# set like a dictionary or an attribute 
d.XYZ = 12.34, 'in' 
d.ABC = 76.54, 'ft' 
 
# get it back like a dictionary or an attribute 
print d.XYZ 
print d.ABC 
 
# get conversions using getvaras or using a specially formed attribute 
print d.getvaras('ABC', 'cm') 
print d.XYZ__mm 

请您参考如下方法:

示例中的 __setattr__ 除了将内容放入 _data 而不是 __dict__ 外, 什么都不做 删除它。

将您的 __getattr__ 更改为使用 __dict__。

将您的值和单位存储为一个简单的二元组。