使用文件来存储属性 descr.py 描述符举例

import os
import pickle

class FileDescr(object):
    saved=[]

    def __init__(self,name=None):
        self.name=name

    def __get__(self,obj,typ=None):
        if self.name not in FileDescr.saved:
            raise AttributeError,\
                  "%r used before assignment" % self.name
        try:
            f=open(self.name,'r')
            val=pickle.load(f)
            f.close()
            return val
        except(pickle.UnpicklingError,IOError,
               EOFError,AttributeError,ImportError,IndexError),e:
            raise AttributeError,\
                  "could not read %r:%s" % self.name

    def __set__(self,obj,val):
        f=open(self.name,'w')
        try:
            #try:
                pickle.dump(val,f)
                FileDescr.saved.append(self.name)
        except (TypeError,pickle.PicklingError),e:
            raise AttributeError,\
                  "could not pickle %r" %self.name
        finally:
            f.close

    def __delete__(self,obj):
        try:
            os.unlink(self.name)
            FileDescr.saved.remove(self.name)
        except (OSError,ValueError),e:
            pass


>>> class MyFileVarClass(object):
... 	foo=FileDescr('foo')
... 	bar=FileDescr('bar')
... 	
>>> fvc=MyFileVarClass()
>>> print fvc.foo
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "D:\Debugpython\descr.py", line 13, in __get__
    "%r used before assignment" % self.name
AttributeError: 'foo' used before assignment
>>> fvc.foo=42
>>> fvc.bar='lianna'
>>> 
>>> print fvc.foo,fvc.bar
42 lianna
>>> del fvc.foo
>>> print fvc.foo,fvc.bar
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "D:\Debugpython\descr.py", line 13, in __get__
    "%r used before assignment" % self.name
AttributeError: 'foo' used before assignment
>>> fvc.foo=__builtins__
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "D:\Debugpython\descr.py", line 32, in __set__
    "could not pickle %r" %self.name
AttributeError: could not pickle 'foo'
>>> 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值