如何解决可变的@property?
有没有办法在 Python 中定义 MUTABLE(不仅仅是可重新分配的!)属性?我需要一个从文件返回列表的属性,并在该列表中使用 __setitem__
时更改该文件。
不起作用的例子:
>>> import mmap
>>> def someClass():
def __init__(self,fileName):
self.fileName = fileName
@property
def data(self):
"""Return data at start of eil in 4 byte chunks"""
with open(self.fileName,mode = 'r+b') as f:
with mmap.mmap(f.fileno(),length=0,access=mmap.ACCESS_READ) as fmap:
data = [fmap[i:i+4] for i in range(1024)]
return data
@data.setter
def data(self,value):
"""Save data to file"""
with open(self.fileName,mode = 'w+b') as f:
with mmap.mmap(f.fileno(),access=mmap.ACCESS_WRITE) as fmap:
for i,data in enumerate(value):
fmap[i:i+4] = data
>>> a = someClass('C:\test.txt')
>>> a.data[0] == a.data[1]
False
>>> a.data[0] = a.data[1]
>>> a.data[0] == a.data[1]
False # Mutation did not register to file
解决方法
我对 mmap
一无所知,所以我可能会搞砸那里的逻辑,但总体思路是一样的。
正如@jasonharper 在评论中所建议的,solotion 是创建一个定义 __setitem__
的客户类并将其用于 someClass().data
。
class FileUpdatingList:
def __init__(self,filename):
self.filename = filename
def __getitem__(self,index):
with open(self.fileName,mode = 'r+b') as f:
with mmap.mmap(f.fileno(),length=0,access=mmap.ACCESS_READ) as fmap:
return fmap[index:index+4]
def __setitem__(self,index,data):
with open(self.fileName,mode = 'w+b') as f:
with mmap.mmap(f.fileno(),access=mmap.ACCESS_WRITE) as fmap:
fmap[index:index+4] = data
现在的问题是 someClass().data = value
不再有效,您必须使用 someClass.data[:] = value
。要解决此问题,您可以编写一个属性来为您执行此操作:
def someClass():
def __init__(self,fileName):
self.fileName = fileName
self._data = FileUpdatingList(filename)
@property
def data(self):
"""Return data at start of eil in 4 byte chunks"""
return self._data
@data.setter
def data(self,value):
"""Save data to file"""
self._data[:] = value
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。