2010-06-11 61 views
2

去创建一个类属性我有下面是一类我做轻松地存储一组数据作为属性。 他们结束存储在字典中。 我重写__getattr____setattr__存储和不同类型的单位检索值回。 当我开始重写__setattr__我遇到了麻烦,创造的__init__像这样2号线,最初的dicionary ...不通过__setattr__

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 
+1

你有没有尝试没有'__setattr__'?如果是这样,你观察到了什么?它应该工作正常。 – 2010-06-11 17:20:28

+0

我需要__setattr__因为我想以类似的方式设置变量的单位,我把它们回来。我在粘贴的副本中没有。 例如'd.XYZ = 12.34,'in''或'd.XYZ__in = 12.34' – 2010-06-11 17:53:11

+0

您的示例中的__setattr__不会执行任何操作。去掉它。尝试没有它。走着瞧吧。将你的价值和单位存储为一个简单的2元组。由于您提供的'__setattr__' *是默认实现,因此您可以将其删除。 – 2010-06-12 02:25:57

回答

0

__setattr__的例子并不任何东西,除了把事情_data而不是__dict__删除它。

更改__getattr__使用__dict__

存储您的值和单位作为一个简单的2元组。