Свойство 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}   

Кажется глупым, но я не могу понять, почему свойства не присоединяются правильно. Предложения?

0 ответов

Другие вопросы по тегам