用self重新初始化一个对象.__ init __(...)

时间:2012-10-26 16:58:32

标签: python

有人可以解释通过调用" self来重新初始化对象是否安全。 init ("。如下面的简化示例所示?

我问的原因是我无法在几本蟒蛇书和互联网上找到这种方法。有些人建议列出所有属性并将它们逐个设置为初始值。基本上我想在完成一些任务后将对象设置为初始状态。

class Book(object):
    def __init__(self,name,author):
        self.name = name
        self.author = author
        self.copies = 5

    def reset(self):
        self.__init__(self.name,self.author)

    def incrementCopy(self):
        self.copies += 1

Kite = Book('kite runner','khaled hosseini')

print 'initial number of copies:', Kite.copies
Kite.incrementCopy()
Kite.incrementCopy()
Kite.incrementCopy()
print '3 copies are added:', Kite.copies
Kite.reset()
print 'number of copies are reinitialized', Kite.copies


initial number of copies: 5
3 copies are added: 8
number of copies are reinitialized 5

3 个答案:

答案 0 :(得分:20)

__init__唯一特别之处在于它是在创建实例时自动调用的。除此之外,它是一种常规方法,使用它将对象设置回初始状态是安全的。

话虽如此,仅仅因为它是安全的并不意味着这是一个好主意。查看代码的其他人可能会对它感到困惑,并且用reset方法(__init__甚至可以调用)来完成有关方法的更明确的方法并不困难。使用

答案 1 :(得分:17)

我认为这是一种非常糟糕的做法 - 你不应该手动__init__(除非调用父类的__init__)。此外,将对象的数据传回__init__有点奇怪。

为什么不这样:

class Book(object):
    def __init__(self,name,author):
        self.name = name
        self.author = author
        self.reset()

    def reset(self):
        self.copies = 5

答案 2 :(得分:-1)

我认为cosider不是不安全的,我已经使用过它,并且内存中没有任何奇怪的事情发生,但是要考虑到其他方法中定义的属性不会被重置。考虑例如:

class Dummy:
    def __init__(self):
        self.x = 4
    def plus_one(self):
        self.x += 1
    def define_other_variables(self):
        self.y = 3
    def reset(self):
        self.__init__()
D = Dummy()
print(D.x) # 4
# print(D.y) will raise an AttributeError
D.plus_one()
D.plus_one()
# D.y do not exist
D.define_other_variables()
# D.y exist
print(D.x) # 6
D.reset()
print(D.x) # 4
print(D.y) # 3, still exist!!

然后,只需记住在 init 函数中定义每个对象。您可以出于这个原因考虑不良做法,但我仍然认为这很优雅。