微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何对一个类进行莳萝并在以后进行修改?

如何解决如何对一个类进行莳萝并在以后进行修改?

我当前正在使用Python的莳萝库,并且正在使用它莳萝一个类。这是课程

class QQQ:
    def __init__(self,name):
        self.name = name
        self.total = 0

    def add_1(self,add):
        self.total = 1 + add
        # To test the below after loading the saved dill
        # self.total = 101 + add

    @property
    def get_total(self):
        return self.total

然后我实例化我的课程并将其莳萝

import dill

path = '/path/file'
dill.settings['recurse'] = True
from x.qqq import QQQ

qqq = QQQ(name='Test1')
qqq.add_1(100)
with open(path,'wb') as f:
    dill.dump(qqq,f)
class QQQ:
    def __init__(self,add):
        # self.total = 1 + add
        self.total = 101 + add

    @property
    def get_total(self):
        return self.total

尽管,如果我在钝化后修改了这个QQQ类,那么我将加载我的转储文件

import dill
path = '/path/file'
dill.settings['recurse'] = True

with open(path,'rb') as f:
    old_class = dill.load(f)

old_class.add_1(100)
total = old_class.get_total

它使用的是修改后的类,而不是我之前讲过的莳萝类。

解决方法

我是dill的作者。它忽略存储的类,因为这被确定是正确的做法。如果您重新定义了类,则有两种选择,可以使用新定义的类...,或者忽略它并使用旧的类定义。 dill的旧版本忽略了新的类定义,但是随后认为这不是正确的默认行为。默认情况下,所有最新版本都将遵循任何重新定义的类。

如果您确实想忽略新的类定义,则必须在加载时执行,如下所述。

>>> import dill
>>> class QQQ(object):
...     def __init__(self):    
...         self.total = 0
...     def increment(self,n=1):
...         self.total += n
... 
>>> q = QQQ() 
>>> q.increment()
>>> q.total
1
>>> dill.dump(q,open('qqq.pkl','wb'))
>>> 

然后重新启动会话。除非使用ignore标志,否则您将获得新的类定义。

>>> import dill
>>> class QQQ(object):
...     def __init__(self):
...         self.total = 0
...     def increment(self,n=10):
...         self.total += n
...     def decrement(self,n=10):
...         self.total -= n
... 
>>> q = dill.load(open('qqq.pkl','rb'))
>>> q.total
1
>>> q.increment()
>>> q.total
11
>>> p = dill.load(open('qqq.pkl','rb'),ignore=True)
>>> p.total
1
>>> p.increment()
>>> p.total
2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。