__new__重载的泡菜对象

时间:2019-06-22 00:32:39

标签: python python-3.x class pickle

在我的程序中,我使用的是从不可变对象的类(namedtuple)派生的类。我之所以选择这样做,是因为元组似乎会导致磁盘上文件的大小显着减小(我最初没有检查它们的可加载性。)而且,有几个静态常量对象正在使用中。取决于输入__new__可以中止计算并返回一个静态对象。

我已经覆盖了__new__方法。 __new__所接受的自变量少于字段的自变量,并且需要进行非平凡的计算以获取其他字段的值。当我尝试释放类的对象时,将以不应该使用的方式调用__new__方法。下面的示例是该问题的简化版本。

示例:

import pickle

class testclass(tuple):
     def __new__(cls,x):
         assert type(x)==int, "Wrong input type to constructor"
         return super().__new__(cls,[x,x*2,x**2])

pickle.loads(pickle.dumps( testclass(4),protocol = -1))

输出:

  

AssertionError

如何使用可序列化的自定义构造函数创建元组对象?


扩展示例。初始计算耗时且不可逆:

import pickle, time

class testclass(tuple):
     def __new__(cls,params):
         assert type(params)==dict, "Wrong input type to constructor"
         a = params['sec']
         p,g = 23, 5
         r = p**a % g
         time.sleep(params['wait'])
         return super().__new__(cls,[p,g,r])

pickle.loads(pickle.dumps( testclass({'sec':4,'wait':1}),protocol = -1))

2 个答案:

答案 0 :(得分:0)

您可以通过定义pickle使用的__getnewargs__()方法来做到这一点:

import pickle


class Testclass(tuple):
    def __new__(cls, x):
        assert isinstance(x, int), "Wrong input type to constructor"
        return super().__new__(cls, (x, x*2, x**2))

    def __getnewargs__(self):
        return (self[0],)  # Just return first element of sequence.


pickle.loads(pickle.dumps(Testclass(4), protocol=-1))

答案 1 :(得分:0)

最后,我确定的答案是“不要腌制Function Get-structure{ [cmdletbinding()] Param ( [string]$inut ) $DelimListItem=$inut -split "\r?\n" $output = ($DelimListItem | Select-Object -Skip 1) -join "!" "{0}!" -f $output } $testdata="APP~MEM~Error Server~00:14~99.54~0~0~0 Server~00:29~99.48~0~0~1" Get-structure -inut $testdata Server~00:14~99.54~0~0~0!Server~00:29~99.48~0~0~1! 重载的对象”。

__new__

在我的代码中,我可以将所有对构造函数的调用替换为显式函数调用。然后将创建\取消选择留给默认的构造函数,这些默认构造函数除了设置字段外没有做太多的事情。