そこで、リストを拡張するクラスを作成しようとしています。リストの特定の部分を参照するように特定の特別な属性をマップするという追加の機能を備えています。このPy3kドキュメントページを使用して、次のコードを作成しました。アイデアは(私がsequence
このクラスのインスタンスを持っていると言う)sequence.seq
は、とまったく同じようsequence[0]
にsequence.index
動作する必要がありsequence[2]
、などとまったく同じように動作する必要があるということです。
リストへのクラス変数マッピング属性にアクセスできないように見えることを除いて、それはうまく機能しているようです。
このSOの質問を見つけましたが、答えが間違っているか、メソッド内で何かが異なります。を使用することもできますself.__class__.__map__
が、内部__getattribute__
にクラス変数が必要なため、無限再帰ループになります。
>>> class Sequence(list):
... __map__ = {'seq': 0,
... 'size': 1,
... 'index': 2,
... 'fdbid': 3,
... 'guide': 4,
... 'factors': 5,
... 'clas': 6,
... 'sorttime': 7,
... 'time': 8,
... 'res': 9,
... 'driver': 10 }
...
... def __setattr__(self, name, value): # "Black magic" meta programming to make certain attributes access the list
... print('Setting atr', name, 'with val', value)
... try:
... self[__map__[name]] = value
... except KeyError:
... object.__setattr__(self, name, value)
...
... def __getattribute__(self, name):
... print('Getting atr', name)
... try:
... return self[__map__[name]]
... except KeyError:
... return object.__getattribute__(self, name)
...
... def __init__(self, seq=0, size=0, index=0, fdbid=0, guide=None, factors=None,
... sorttime=None, time=None):
... super().__init__([None for i in range(11)]) # Be sure the list has the necessary length
... self.seq = seq
... self.index = index
... self.size = size
... self.fdbid = fdbid
... self.guide = ''
... self.time = time
... self.sorttime = sorttime
... self.factors = factors
... self.res = ''
... self.driver = ''
...
>>> a = Sequence()
Setting atr seq with val 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 31, in __init__
File "<stdin>", line 17, in __setattr__
NameError: global name '__map__' is not defined