gpt4 book ai didi

__getinitargs__ 的 Python 3 替代方案

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:16 25 4
gpt4 key购买 nike

在 Python 3 的 unpickling 期间,是否有足够短的方法来调用类的 __init__ 构造函数?通常的方法是像这样使用 __getinitargs__

from __future__ import print_function
import pickle

class Car:

def __init__(self, model, number):
self.model = model
self.number = number
print("constructed with", model, number)
# many other things to do

def __getstate__(self):
# intentionally returns None
pass

def __setstate__(self, state):
pass

def __getinitargs__(self):
# save some information when pickling
# (will be passed to the constructor upon unpickling)
return self.model, self.number

c = Car("toyota", 1234)
d = pickle.loads(pickle.dumps(c))
print("reconstructed with", d.model, d.number)

但是,__getinitargs__ 将在新样式类中被忽略,在 Python 3+ 中,所有类只能是新样式类。有 __getnewargs__ 但它只会将参数传递给 __new__ 类方法,这是不一样的。上述说明性示例的 python 2 调用将导致

>> constructed with toyota 1234
>> constructed with toyota 1234
>> reconstructed with toyota 1234

虽然 python 3 调用会出错

>> constructed with toyota 1234
Traceback (most recent call last):
File "test.py", line 26, in <module>
print("reconstructed with", d.model, d.number)
AttributeError: 'Car' object has no attribute 'model'

并忽略 __getinitargs__ 方法。

我不认为 Python 3 在这方面会轻易倒退,所以希望我遗漏了一些明显的东西。

编辑:将 __getinitargs__ 替换为 __getnewargs__ 无法解决问题。

最佳答案

如果你想要pickle通过调用Car(self.model, self.number)来unpickle你的对象,通过__init__进行初始化与普通调用 Car 的方式相同,然后在 __reduce__ method 中告诉它这样做:

def __reduce__(self):
return (Car, (self.model, self.number))

Demo .

关于__getinitargs__ 的 Python 3 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50308214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com