在我的程序中,我使用的是从不可变对象的类(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))
答案 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__
在我的代码中,我可以将所有对构造函数的调用替换为显式函数调用。然后将创建\取消选择留给默认的构造函数,这些默认构造函数除了设置字段外没有做太多的事情。