2016-09-29 12 views
0

Pythonでは、クラスを定義するときに、新しい属性定義で以前に定義された属性を参照することなく使用できます。Python:クラスレベルの属性定義でスーパー属性にアクセスする方法

class Parent(object): 
    a_value = 'a' 
    another_value = 'b' 
    all_values = (a_value, another_value) 

派生クラスで同じことを実行できますが、これらの親属性の一部にはまだアクセスできますか?

私はこのような何かやってみました:

class Child(Parent): 
    a_child_value = 'c' 
    all_values = (a_value, another_value, a_child_value) 

をしかし、それは考慮に親の継承を取らないようだと私は次のエラーを与える:

NameError: name 'a_value' is not defined 

ので、そこにありますa_valueanother_valueが現在のコンテキストではなく親クラスのものでなければならないことを示す方法はありますか?

私の場合、特に値は文字列ではなく、あらかじめコンパイルされた正規表現なので、新しいインスタンスが作成されるたびに__init__メソッド内に作成する必要はありません。

+0

@Moses Koledoye:私はこれを重複とはみなしませんでした。私が探していた情報が暗黙のうちに含まれていましたが、何が尋ねられているかは異なります。私はどこでも見つけられないので何かをする方法について尋ねました。そしてその質問は「なぜ」それがこのように行われなければならないのかを尋ねます。 –

+0

あなたの質問に答えている以上の欺瞞標的。それはあなたが望むものをより詳細に記述します。なぜ、どのように。質問は全く同じである必要はありません。 –

答えて

1

あなたが値を取得するには、Parent.a_valueを実行する必要があります。 a_childは静的な属性なので、ローカル変数ではなくクラス自体にアタッチされます。

class Child(Parent): 
    a_child_value = 'c' 
    all_values = (Parent.a_value, Parent.another_value, a_child_value) 

何かから派生している場合は、それが由来するものを入力する必要があります。

+0

'Child'はまだ完全には定義されておらず、有効な参照として存在しないので、これは有効な解決策ではありません。 'NameError:name 'Child' is not defined。 –

+0

はい、あなたは正しいです、私は大変です。(あなたはいつでも質問に答える前に自分で試してください)統計的なものではなく、そのように働いていたであろう。私は実際にテストをしましたが、親としてXを、子供としてYだけを素早く組み立て、IDEから "a"属性( "X")を得ることができるかどうかをチェックしました ">>>"その行の適切な名前を知っていない)。 – Frogboxe

1

このようです。

class Child(Parent): 

    a_child_value = 'c' 

    all_values = (Parent.a_value, Parent.another_value, a_child_value) 
+0

はい、それはもっとそれに似ています。 –

+0

オブジェクト型クラスからParentを作成する場合。それを扱う別の方法があります。それはより意味をなさないでしょう。 – Howardyan

+0

「オブジェクトから親を作成する」とはどういう意味ですか?また、それが理にかなっていれば、なぜ答えの代わりに答えを使用しないのですか? –

関連する問題