2

以下にあるのは、一連のデータを属性として簡単に保存するために作成したクラスです。それらは辞書に格納されてしまいます。と をオーバーライド__getattr____setattr__て、さまざまな種類の単位で値を保存および取得します。オーバーライドを開始したとき__setattr__、2行目の最初の辞書を作成するのに問題がありました__init__...

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
4

1 に答える 1

0

あなたの例では、それを 削除する 代わりに物を入れる以外は何も__setattr__ません。_data__dict__

__getattr__を使用するように変更します__dict__

値と単位を単純な 2 タプルとして保存します。

于 2010-06-12T02:27:02.480 に答える