你可以建立一個自定義類,使用__slots__
限制量可能使用的內存:
class MutableEfficientNamedList(object):
__slots__ = ('field1', 'field2', 'field3')
def __init__(self, *values):
for k, v in zip(self.__slots__, values):
setattr(self, k, v)
def __getitem__(self, i):
return getattr(self, self.__slots__[i])
def __setitem__(self, i, v):
return setattr(self, self.__slots__[i], v)
def __repr__(self):
return '{}({})'.format(type(self).__name__,
', '.join(repr(getattr(self, s)) for s in self.__slots__))
然後在你的結構中使用這些。它們可以像命名元組一樣使用(允許通過索引和按名稱訪問),但它們允許突變。通過使用__slots__
每個實例的內存佔用量仍然很低:
>>> menl = MutableEfficientNamedList('foo', 'bar', 'baz')
>>> menl
MutableEfficientNamedList('foo', 'bar', 'baz')
>>> menl.field1
'foo'
>>> menl[0]
'foo'
>>> menl[1]
'bar'
>>> menl[1] = 'spam'
>>> menl.field2
'spam'
當然,你給插槽有意義的名稱,並請挑選一個更好的名字爲自己的課程比我在我的例子中使用。 :-)
要在namedtuple()
模式擴大,這裏是一個通用的工廠函數:
def namedlist(name, *attrs):
"""Create a named list class named `name` with attributes `attrs`.
`attrs` must be strings representing valid Python identifiers.
"""
class MutableEfficientNamedList(object):
__slots__ = attrs
def __init__(self, *values):
for k, v in zip(self.__slots__, values):
setattr(self, k, v)
def __getitem__(self, i):
return getattr(self, self.__slots__[i])
def __setitem__(self, i, v):
return setattr(self, self.__slots__[i], v)
def __repr__(self):
return '{}({})'.format(type(self).__name__,
', '.join(repr(getattr(self, s)) for s in self.__slots__))
MutableEfficientNamedList.__name__ = name
return MutableEfficientNamedList
MyList = namedlist('MyList', 'foo', 'bar', 'baz')
nl = MyList(1, 2, 3)
print nl # MyList(1, 2, 3)
print nl.bar # 2
print nl[1] # 2
我不知道這是可能的,如果我理解正確的問題。像dict這樣的可變對象不能是字典鍵。 – millimoose 2013-03-10 13:29:25
無論如何,目前還不清楚你想要完成什麼。你能舉一個例子說明這個數據結構是如何「折衷地」構建的?即給定單個更新之前和之後的狀態? – millimoose 2013-03-10 13:30:44
我不知道我明白..我在哪裏建議,字典將作爲密鑰? – phistakis 2013-03-10 13:31:46