10

我正在增强一个现有的类,该类在__init__函数中进行一些计算以确定实例状态。可以调用__init__()from__getstate__()以重用这些计算吗?

4

3 回答 3

4

总结 Kroltan 和 jonsrharpe 的反应:

从技术上讲是可以的

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

实际上这很棘手,请避免

如果您将来编辑代码并触摸__init__,那么很容易(甚至对您而言)忘记使用 in__setstate__然后您进入难以调试的情况(问自己,它来自哪里)。

class Calculator():
    def __init__(self):
        # some calculation stuff here
    def __setstate__(self, state)
        self.__init__()

计算的东西最好隔离到另一个共享方法中:

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

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

    def _shared_calculation(self):
        #some calculation stuff here

这样你就会注意到。

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

于 2014-05-04T22:04:37.967 回答
2

通常最好编写一个名为的方法__getnewargs__。这样,Pickling 机制将__init__自动调用您。

于 2014-12-12T14:13:45.080 回答
-1

另一种方法是在子类__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'

以这种方式调用构造函数类被证明是 Python 中非常常见的编码模式。就其本身而言,Python 使用继承在构造时仅查找和调用一种__init__方法——类树中最低的一种。

如果您需要__init__在构建时运行更高的方法,则必须手动调用它们,并且通常通过超类名称,如上面的代码所示。他用他的方式来增加超类构造函数并根据自己的喜好完全替换子类中的逻辑

正如 Jan 所建议的那样,这很棘手,如果您在同一个班级中调用它,您将进入困难的调试情况

于 2014-05-05T06:03:01.360 回答