2012-02-09 4 views
12

クラスのinit__機能の自己.__で__dict__の使用(ただし、コードは期待どおりにエラーなく動作します)。Python的:<em>スパイダー</em> IDEで新しいクラスをコーディングし、最終的な結果を確認するために<em>pylint</em>を使用している間、私はエラーメッセージに遭遇しました

コンテキスト:コンストラクタ関数では、私は新しいメンバー(かなりたくさん)を作りたいと思います。 ()のは、彼らが(すべてのdictあるとしましょう)同じ初期値をすべて設定して、(のは、10をしましょう)

class MyClass(): 
    def __init__(self): 
     self.a = ... 
     self.b = ... 

しかし、多くのメンバーの場合:通常、これらは、私は、このコーディングを使用するように、十分な数です

class MyClass(): 
    def my_method(self): 
     print self.c 

エラーで:クラスでさらに

class MyClass(): def __init__(self): _vars = ["a", "b", "c", ...] for _var in _vars: self.__dict__[_var] = dict() 

は、私が使用してメンバーに参照のうえした、私はそれを行うように誘惑されました(スパイダー中)pylint

MyClass.my_method: 'MyClassの' のインスタンスには「c'memberを持っていない、このファイルにpylintを使用する場合

、私はというエラーメッセージを持っています。

ただし、コードはエラーなく、うまく動作します。私は問題なくメンバー 'c'にアクセスすることができます。

質問:これは適切なコーディングですか、またはメンバーを初期化するためのこのような方法を避けるべきですか?

+2

を私はあなたがMyClass' 'で何をしようとしている正確にわからないんだけど、あなたは(' collections.defaultdictに投資する可能性があるように聞こえます) '。 http://docs.python.org/library/collections.html#collections.defaultdictをご覧ください。他の人が辞書であるインスタンス変数を作成するのではなく、self .__ dict__を変更することに関して何を話しているかに興味があります。 – Noah

+0

@ノアありがとうノア、私はdefaultdictクラスを知らなかった。本当に面白いね!私は今、私が確かにコードのためのいくつかの "ツール"をコーディングしているのを見ています。これは、より良いコード化されたいくつかのPythonモジュールで作成されている可能性があります(例えば、defaultdictのように、はるかに複雑ではありません)。どうもありがとう。 – mhavel

答えて

16

をはい、直接インスタンス辞書を更新するのが合理的です。あるいは、setattrを使用して変数を更新することもできます。私は両方のアプローチがプロダクションコードで使用されているのを見ました。 setattr

直接インスタンス辞書に触れる必要はありません。

class MyClass(): 
    def __init__(self): 
     for var in 'a', 'b', 'c': 
      setattr(self, var, dict()) 

しかし、あなたは直接インスタンス辞書を更新する場合、考慮すべき夫婦可能な改善があります。たとえば、__dict__の代わりにvars()を使用すると、より見栄えがよくなります。また、あなたはキーワード引数でdict.updateメソッドを使用することができます。

class MyClass(): 
    def __init__(self): 
     vars(self).update(a=dict(), b=dict(), c=dict()) 
+1

ありがとうRaymond、あなたの答えは、本当に明確で助けになります(私にとっては少なくとも)。私はこの時点でいくつかのPythonの背景を見逃しているようです... – mhavel

5

実際には問題ありませんが、一般的には__dict__をつぶすのを避けることをおすすめします。たとえば、オブジェクトの属性のカスタムセッターを後でロードする場合はどうなりますか?あなたの例の場合

、あなたは、単に次のようにループのために、あなたの中の行を置き換えることができます:

setattr(self, _var, dict()) 
+0

ありがとうございます。この場合、この関数は実際に便利です。私は試してみるつもりだ。 – mhavel

関連する問題

 関連する問題