При создании объектов результата в классе можно использовать __slots__
в этом примере? Я думал, что я мог заставить его работать, передавая '__slots__'
в словарь для третьего аргумента type
:Создание динамического класса с типом и __slots__?
class GeocodeResult(object):
"""class to handle Reverse Geocode Result"""
__slots__ = ['geometry', 'response', 'spatialReference',
'candidates', 'locations', 'address', 'type', 'results']
def __init__(self, res_dict, geo_type):
RequestError(res_dict)
self.response = res_dict
self.type = 'esri_' + geo_type
self.spatialReference = None
self.candidates = []
self.locations = []
self.address = []
if 'spatialReference' in self.response:
self.spatialReference = self.response['spatialReference']
# more stuff
@property
def results(self):
results = []
for result in self.address + self.candidates + self.locations:
result['__slots__'] = ['address', 'score', 'location', 'attributes']
results.append(type('GeocodeResult.result', (object,), result))
return results
def __len__(self):
"""get length of results"""
return len(self.results)
Для results
собственности, я хочу, чтобы создать список небольшой, легкий вес объекты с 4-мя свойствами: ['address', 'score', 'location', 'attributes']
Получившийся объект создан, и я даже могу попасть в слоты, но он все еще держит __dict__
. Поскольку потенциально могут быть сотни объектов результатов, я хочу, чтобы только четыре свойства, перечисленные выше, сохраняли пространство.
Пример:
>>> rev = GeocodeResult(r, 'reverseGeocode')
>>> result = rev.results[0]
>>> result.__slots__
['address', 'score', 'location', 'attributes']
>>> hasattr(result, '__dict__')
True
>>>
Есть ли лучший способ сделать это? Или мне нужно определить явный класс для этого?
Это сработало красиво! Мне удалось значительно уменьшить размер объектов результата, используя namedtuple. Спасибо! – crmackey