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

标签 python class setattr

下面是我制作的一个类,可以轻松地将一堆数据存储为属性。 他们最终被存储在字典中。 我重写了 __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__

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

关于python - 无需通过 __setattr__ 创建类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3024790/

相关文章:

c++ - 静态类 C++

python - 类范围内的动态实例变量

python - 使用 object.__setattr__ 时出现 AttributeError

python - 名称错误 : name of the class not defined inside the class itself - python

python - Scikit-learn:如何在一维数组上运行 KMeans?

python - 如何检测 Excel 工作表中的合并单元格?

python - 如果我的资源更新方法还创建了不同类型的资源,它是否是线程安全的?

c++ - 类递归数组

python - 在 python 中重写 __setattr__ 和 __getattribute__ 时,无法更新可变实例属性

python : Convert from C-Char to Int