从对象内部调用__init __()的效果

时间:2013-11-07 18:28:09

标签: python constructor garbage-collection reset init

我有一个班,我有时想'重置'。我没有手动清除类中的所有变量以及它使用的所有模块,而是认为通过在自身上调用 init 来重构它可能是个好主意。我担心的是,我不太确定这是一个好的模式,还是GC正在清除旧的对象。

以下是一个例子:

from modules import SmallClass
from modules import AnotherClass

class BigClass(object):
    def __init__(self, server=None):
        """construct the big class"""
        self.server = server
        self.small_class = SmallClass(self.server)
        self.another_class = AnotherClass(small_class)

    def reset_class(self):
        """reset the big class"""
        self.__init__(self.server)

这会导致问题,还是有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:5)

我建议反过来做这件事:

from modules import SmallClass
from modules import AnotherClass

class BigClass(object):
    def __init__(self, server=None):
        """construct the big class"""
        self.reset_class(server)

    def reset_class(self, server=None):
        """reset the big class"""
        self.server = server
        self.small_class = SmallClass(self.server)
        self.another_class = AnotherClass(small_class)

这种模式很常见,因为它允许__init__重置类,你也可以单独重置类。我也在其他面向对象的语言中看到过这种模式,比如Java。

答案 1 :(得分:1)

这样做是安全的,__init__除了被自动调用之外没有任何魔力。

但是,正常的做法是将公共代码重构为reset_class方法(我称之为reset btw,类已经在类名中)。只需从reset方法调用__init__