Свойство Python связало неправильную функцию с именем атрибута
Я реализую простой механизм именованного кортежа, который имеет атрибуты только для чтения вместо чтения / записи.
def ReadOnlyNamedTuple( *fields ):
class Base( object ):
_fields = fields[:]
def __init__( self, *values ):
assert len(values) == len(Base._fields), "Incorrect number of arguments, expected %d" % len(Base._fields)
self._field_values = dict( zip( Base._fields, values ) )
def __getitem__( self, i ):
return self._field_values[ Base._fields[i] ]
def __len__(self):
return len( self._field_values )
# attach the fields to the class with properties:
for attr in fields :
fn = lambda s : s._field_values[attr]
fn = property( fn )
setattr( Base, attr, fn )
return Base
Когда я выполняю это, последняя лямбда-функция "getter", кажется, присоединяется ко всем свойствам.
>>>
>>> C = ReadOnlyNamedTuple( 'a','b','c' )
>>> c = C( 1, 2, 3 )
>>> c[0]
1
>>> c[1]
2
>>> c[2]
3
>>> c.a
3
>>> c.b
3
>>> c.c
3
>>> c._field_values
{'a': 1, 'c': 3, 'b': 2}
Кажется глупым, но я не могу понять, почему свойства не присоединяются правильно. Предложения?