Python 从设置状态调用初始化可以吗__

Python 从设置状态调用初始化可以吗__,python,pickle,init,getstate,Python,Pickle,Init,Getstate,我正在增强一个现有类,该类在\uuuu init\uuuu函数中执行一些计算,以确定实例状态。从\uu getstate\uuuuuuuuuuuuuuuuuuuuuuuuuuu()调用\uuuuuuuuuuuuu init()以重用这些计算可以吗?总结Kroltan和Jonsharpe的反应: 从技术上讲,这是可以的 从技术上讲,它会工作,如果你做得好,它可以被认为是好的 实际上,这很棘手,避免这样做 如果您以后编辑代码并触摸\uuuuu init\uuuuuu,那么(甚至对您来说)很容易忘记在

我正在增强一个现有类,该类在
\uuuu init\uuuu
函数中执行一些计算,以确定实例状态。从
\uu getstate\uuuuuuuuuuuuuuuuuuuuuuuuuuu()
调用
\uuuuuuuuuuuuu init()
以重用这些计算可以吗?

总结Kroltan和Jonsharpe的反应:

从技术上讲,这是可以的 从技术上讲,它会工作,如果你做得好,它可以被认为是好的

实际上,这很棘手,避免这样做 如果您以后编辑代码并触摸
\uuuuu init\uuuuuu
,那么(甚至对您来说)很容易忘记在
\uuuuuuu setstate\uuuuu
中的使用,然后您就进入了难以调试的情况(问问自己,它来自哪里)

最好将计算内容隔离到另一个共享方法中:

class Calculator():
    def __init__(self):
        self._shared_calculation()   

    def __setstate__(self, state)
        self._shared_calculation()

    def _shared_calculation(self):
        #some calculation stuff here
这样你会注意到的


注意:使用“uu”作为共享方法的前缀是任意的,您不必这样做。

另一种方法是在子类中自定义构造函数类
\uuuuu init\uuuu
。理想情况下,最好只有一个构造函数类&在子类中根据需要进行更改

class Person:
    def __init__(self, name, job=None, pay=0):
        self.name = name
        self.job = job
        self.pay = pay

class Manager(Person):
    def __init__(self, name, pay):                   
        Person.__init__(self, name, 'title', pay)  # Run constructor with 'title'
以这种方式调用构造函数类是Python中非常常见的编码模式。Python本身使用继承在构造时只查找和调用一个
\uuuuu init\uuuu
方法类树中最低的方法

如果需要在构造时运行更高的
\uuuuu init\uuuu
方法,则必须手动调用它们,通常通过超类名称调用它们,如上面代码中所示。他的方法是扩展超类构造函数&完全按照您的喜好替换子类中的逻辑


正如Jan所建议的那样,这是一个棘手的问题&如果在同一个类中调用它,您将进入困难的调试状态

通常最好编写一个名为的方法。这样,pickle机制将自动为您调用
\uuuu init\uuu

如果该类是您的,当然!我建议将这些计算分离到一个classmethod中,并从
\uuuuu init\uuuuu
\uuuu getstate\uuuu
中调用它。我会支持@Kroltan-我会将这些计算移到一个单独的实例/类方法中,而不是再次调用
\uuuu init\uuuu
。你想从
\uuuu setstate\uuuu
\uuuu getstate\uuuuu
调用
\uuuu init\uuuuu
还是调用
\uuuuuu getstate\uuuuuuuuu
调用
\uuuuu setstate\uuuuuuuuu
调用来调用
,这并没有回答最初的问题。我发现在没有调用init的情况下构造对象更奇怪。我没有设法让它工作。看了医生,还是不动。采用上述方法
class Person:
    def __init__(self, name, job=None, pay=0):
        self.name = name
        self.job = job
        self.pay = pay

class Manager(Person):
    def __init__(self, name, pay):                   
        Person.__init__(self, name, 'title', pay)  # Run constructor with 'title'