我在下面提到的是一个轻松存储大量数据作为属性的类。
他们最终被存储在字典中。
我重写__getattr__
和__setattr__
来以不同类型的单位存储和检索值。
当我开始覆盖__setattr__
时,我很难在__init__
的第二行创建初始的dicionary,就像这样......
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
答案 0 :(得分:0)
示例中的__setattr__
不会执行除了_data
而不是__dict__
之外的任何事情。删除它。
将__getattr__
更改为使用__dict__
。
将您的价值和单位存储为简单的2元组。