Python 使用self重新初始化对象。\uuuu init\uuuuuu(…)

Python 使用self重新初始化对象。\uuuu init\uuuuuu(…),python,Python,有人能解释一下通过调用“self.init(”重新初始化对象是否安全吗?如下面的简化示例所示 我问这个问题的原因是,我在几本python书籍和互联网上都找不到这个方法。有人建议列出所有属性并逐个将它们设置为初始值。基本上,我想在完成一些任务后将对象设置为初始状态 class Book(object): def __init__(self,name,author): self.name = name self.author = author

有人能解释一下通过调用“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

我认为这是一个非常糟糕的实践——你不应该手动地写代码“y>iITyt<”(除非调用父类的代码>代码> 为什么不这样做:

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

    def reset(self):
        self.copies = 5

\uuuu init\uuuu
的唯一特殊之处在于,创建实例时会自动调用它。除此之外,它是一种普通方法,使用它可以安全地将对象设置回初始状态


也就是说,仅仅因为它是安全的并不意味着它是一个好主意。其他人看你的代码可能会被它弄糊涂,而且用
重置
方法(该
\uuuu init\uuu
甚至可以调用)做任何事情并不困难要更清楚地说明如何使用该方法。

我认为不是不安全的,我已经使用过它,而且内存中没有任何奇怪的事情发生,但是要考虑到其他方法中定义的属性将不会被重置。
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 <强>函数中定义每个对象。为此,您可以考虑不好的实践,但我仍然认为它是优雅的。

为什么您不能在<代码>重置< /代码>函数本身中,在您必须再次传递初始值之后?<代码>自我>名称< /代码>和代码> >作者> <代码>访问CURR。租值,而不是初始的.self.name和self.author不会更改,在本例中可以忽略它们。我的问题是关于self.\uuuu init\uuuu部分。我不太理解你的问题。你说的“那”是什么意思?+1.标准解决方案(不仅在Python中,而且在大多数具有构造函数的语言中)唯一的问题是我得到了代码lint警告:“实例属性副本在init之外定义”是的,建议的方法似乎是在
\uuuuuu init\uuuu
中创建所有属性,坦率地说,我宁愿忽略它,避免重复。