__slots__で指定したアトリビュート名でアクセスできない。普通は__dict__だが、__slots__していると__dict__は存在しない。たとえばDecimalだとこんな感じ。何が問題かというと、__new__の中で初期化ができなくなる。その部分はclass変数でフラグしてごまかしたとしても、今度は__setattr__が実装できない。
In [33]: d.__
d.__abs__ d.__doc__ d.__mod__ d.__radd__ d.__rpow__
d.__add__ d.__eq__ d.__module__ d.__rdiv__ d.__rsub__
d.__class__ d.__float__ d.__mul__ d.__rdivmod__ d.__rtruediv__
d.__cmp__ d.__floordiv__ d.__ne__ d.__reduce__ d.__setattr__
d.__copy__ d.__getattribute__ d.__neg__ d.__reduce_ex__ d.__slots__
d.__deepcopy__ d.__hash__ d.__new__ d.__repr__ d.__str__
d.__delattr__ d.__init__ d.__nonzero__ d.__rfloordiv__ d.__sub__
d.__div__ d.__int__ d.__pos__ d.__rmod__ d.__truediv__
d.__divmod__ d.__long__ d.__pow__ d.__rmul__
なにがほしいかというと、
In [16]: d.__slots__
Out[16]: ('_exp', '_int', '_sign', '_is_special')
なるときには
d.__values__[0] == d._exp
な__values__のようなものがほしい。
__slots__と__setattr__で検索したらこんなのが見つかった。
class _Flag(object):
__slots__ = ('Normalize', 'SplitAlpha', 'SplitDigit',
'SplitSymbol', 'MorphAnalyse', 'Ngram',
'Delimited', 'EnableSuffixSearch',
'DisableSuffixSearch', 'WithStore', 'WithVacuum')
def __init__(self):
s = lambda x,y: object.__setattr__(self, x, y)
s('Normalize', _sen.SEN_INDEX_NORMALIZE)
s('SplitAlpha', _sen.SEN_INDEX_SPLIT_ALPHA)
s('SplitDigit' , _sen.SEN_INDEX_SPLIT_DIGIT)
s('SplitSymbol' , _sen.SEN_INDEX_SPLIT_SYMBOL)
s('MorphAnalyse', _sen.SEN_INDEX_MORPH_ANALYSE)
s('Ngram', _sen.SEN_INDEX_NGRAM)
s('Delimited', _sen.SEN_INDEX_DELIMITED)
s('EnableSuffixSearch', _sen.SEN_INDEX_ENABLE_SUFFIX_SEARCH)
s('DisableSuffixSearch', _sen.SEN_INDEX_DISABLE_SUFFIX_SEARCH)
s('WithStore', _sen.SEN_INDEX_WITH_STORE)
s('WithVacuum', _sen.SEN_INDEX_WITH_VACUUM)
def __getattr__(self, name):
raise AttributeError
def __setattr__(self, name, value):
raise AttributeError
なるほど、superで代入しちゃうのね。newではsuperでobjectのsetattrが呼ばれるが、そとから使うとderiveしたクラスのsetattrが呼ばれるということか。
0 件のコメント:
コメントを投稿