2017-02-03 28 views
-2

ネストされたクラスから変数にアクセスする必要があります。目的は、Marshmallowライブラリを使用してスキーマを作成することです。コードは次のようになります。Pythonで変数からクラス属性を定義するにはどうすればよいですか?

class ParserScheme(Schema): 

    class Meta: 
     # Here I meed to access the value of my_variable : 
     result = func(my_variable) 

my_variable = 'foo' 
my_parser = ParserScheme() 

私は外部クラス(ParserScheme)のクラス属性としての私の変数を渡すために管理している場合、内部クラス(メタ)にそれを取得することは容易です。

class ParserScheme(Schema): 
    class_attribute = my_variable 
    class Meta: 
     result = func(ParserScheme.class_attribute) 

my_variable = 'foo' 
my_parser = ParserScheme() 

しかし、私は動的にクラス属性を設定する方法を見つけることができないようです。私が "クラシック"属性(クラス自体ではなくクラスのインスタンスの属性を意味する)を設定すると、内部クラスからアクセスできなくなります。

私もグローバル変数を使用すると考えましたが、それは本当に私を満足させるものではありません。これを行う別の方法がありますか?

私はOOPの新人です。クラス属性の概念を本当によく理解しているかどうかはわかりません。私はそれを行う簡単な方法があることを恐れているが、私はこれがうまくいくと思う方法に焦点を当てているので、私はそれを見なかった...

答えて

1

名前がmy_variableはまだ定義されていないclass Metaステートメントの本体が実行されます。

あなたは第二の例のいずれかと同じ理由(class ParserScheme文の本体が実行されたときmy_variableがまだ定義されていない)のために動作しません、それはclass Meta文の本体を実行するとき、それが実行されますので、それはまだ破るだった場合class ParserSchemeステートメントの本体の一部として、の前にの前に名前ParserSchemeが定義されています。

ここで理解しなければならないのは、classdefは、モジュールが現在のプロセスに最初にインポートされたときに(モジュールの最上位にある場合)実行可能な文です。 classステートメントの場合、ステートメントの本体が最初に専用名前空間で順次実行され、この名前空間がメタクラスコンストラクターに渡され、クラスオブジェクトの属性(YourClass.__dict__)の作成に使用されます。

長い話を短くする:class文の本体では、あなただけのまだ現在または囲みスコープで定義されていない参照名ことはできませんが。期間。

明白な解決策は、classステートメントの前にmy_variableを定義することですが、もっと動的にしたいと思いますか?はい場合は、関数内でクラスを定義する必要があります:

def create_parser_class(my_variable): 

    class ParserScheme(Schema): 

     class Meta: 
      result = func(my_variable) 


    return ParserScheme 


my_variable = 42 
cls = create_parser_class(my_variable) 
my_parser = cls() 

しかし、私はそれが箱から出して動作し(またしても、すべてのFWIWで働く)私は使ったことがないマシュマロと(うgaranteeすることはできませんおそらくいくつかのメタクラスが起こっている)。 my_variableが使用されているかどうかによっては、引数と同じ値のcreate_parser_classへの2回の呼び出しを行わないようにすることもできます。

最後に、おそらくXY problemがあります。誰かが少しわかりにくい、または珍しいやり方を尋ねる場合があります。おそらく、あなたはあなたの投稿を編集して、「問題の背後にある」、つまりこの「解決策」で実際に解決しようとしている問題を説明するべきです。

ああ、はい:

私はOOPにかなり新しいです、と私は、私は本当によくPythonでクラス属性の概念

を理解してわからない、クラスは(あまりにインスタンスオブジェクトでありますデフォルトではtypeオブジェクト)、それ自体の属性を持っています。 classステートメントの最上位に定義したすべての名前(defステートメント、classステートメントまたはimportステートメント)は、カスタムメタクラスがいくつかの変換を途中で行わない限り、クラスオブジェクトの属性になります。 )です。

クラス属性はインスタンスからアクセス可能であり(eponymインスタンス変数によってシャドウされていない限り)、すべてのインスタンスで共有されます。

+0

ご協力ありがとうございます、これが私の問題を解決しました! 実際にはXYの問題があるかもしれませんが、私が見つけた他の解決策がうまくいかず、どうして私がこれをやり遂げたのか、私が比較的よく理解しているように感じます。とにかく、後で根本的な問題を解決しようとするかもしれませんが、私は今この解決策に満足しています! – adurivault

関連する問題