2012-10-26 10 views
12

誰もがそれを呼び出すことによって、オブジェクトを再初期化しても安全であるかどうかを説明してもらえ「自己を。のinit(」。次簡略化した例のように?は自己を持つオブジェクトを再初期化.__の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 
+1

初期値を再度渡さなければならないのに、なぜあなたは 'reset'関数自体でそれを行うことができませんか? 'self.name'と' self.author'は初期値ではなく現在の値にアクセスします。 –

+0

self.nameとself.authorは変更されませんが、この例では無視できます。私の質問はself .__ init__部分についてです。私はあなたの質問をよく理解していませんでした。 "それ"って何を意味しますか? –

答えて

14

私はそれを非常に悪い習慣とみなします。 t __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 
+3

+1。標準的な解決策(Pythonだけでなく、コンストラクタを持つほとんどの言語で)は、コンストラクタと通常の関数の両方で必要とされるコードを除外することです。 – abarnert

+0

これだけの問題は、コードリントの警告を受け取ります: "__init__の外で定義されたインスタンス属性のコピー" – Greg

+0

はい、推奨される方法は、 '__init__'のすべての属性を作成するようですが、私はそれを無視して重複を避ける方が好きです。 –

19

__init__に関する特別な唯一のものは、インスタンスが作成されたときに自動的に呼び出されることです。それ以外は通常の方法であり、オブジェクトを初期状態に戻すために使用するのは安全です。

言われていることは、それが安全であるということだけが良いアイデアであるとは限りません。あなたのコードを見ている他の人は、それを混乱させるかもしれません。resetメソッド(すべて__init__でも呼び出すことができます)ですべてを行うのは難しいことではありません。

関連する問題