2016-11-15 3 views
1

は、以下のクラスを検討:__init__が完了する前にメンバ関数でインスタンス変数を使うべきですか?例えば

class A: 
    def __init__(self): 
     self.attr1 = value 
     self.attr2 = self.foo() 
    def foo(self): 
     return self.attr1 ** 2 

これが正しい方法ですが、私は、パラメータとしてfooからattr1を渡す必要があるか、私はクラスの外fooを定義する必要がありますか?

+0

このメソッドを呼び出す方法は、完全に安全ではありません。たとえば、オブジェクトを作成するたびにオブジェクトの 'repr'を記録しようとすると、' __repr__'は安全にサブクラスによってオーバーライドできません。 (この問題を回避する方法はありますが、完全に安全ではありません) – user2357112

答えて

2

これは完全にうまく、共通のパターンです。これを呼び出す前に、すべての属性を既に設定していることに注意してください。foo()

これは、コンテナクラスを定義するときによく使用されます。たとえば、リストのようなクラス:

class ListLike: 
    def __init__(self, items=[]): 
     self.lst = [] 
     self.thingy = 'foo' 
     for item in items: 
      self.add(item) 

    def add(self, item): 
     self.lst.append(item) 
+0

変更可能なデフォルトの引数は[いい考えではありません]です(http://stackoverflow.com/q/1132941/3001761) 。 – jonrsharpe

+1

@jonrsharpe、ありがとう - 私は間違いなくデフォルトの変更可能な問題を認識しています。しかし、実際に突然変異を起こしているのは唯一の問題です。私はここにはいないので、より簡単で効率的です。あるいは 'items = None'を実行してからitemまたは[]:'の項目に対して 'を実行することもできます。 –

関連する問題