有人可以解释通过调用" 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
答案 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 函数中定义每个对象。您可以出于这个原因考虑不良做法,但我仍然认为这很优雅。