30

任何人都可以通过调用“ self.init (”来解释重新初始化对象是否安全。如以下简化示例所示?

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

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
4

3 回答 3

33

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

话虽如此,仅仅因为它是安全的并不意味着它是一个好主意。其他查看您的代码的人可能会对此感到困惑,并且在reset方法(__init__甚至可以调用)中执行所有操作以更明确地了解该方法的使用方式并不难。

于 2012-10-26T17:09:44.243 回答
29

我认为这是一种非常糟糕的做法 - 你不应该__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
于 2012-10-26T17:05:22.300 回答
4

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

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函数中定义每个对象。出于这个原因,您可以考虑不好的做法,但我仍然认为它很优雅。

于 2018-09-16T01:34:13.737 回答