2016-07-02 5 views
2

Pythonではクラス内からClassName.class_varまたはself.class_varのいずれかのクラスレベル変数を参照できます。今では、同じ名前のインスタンス変数を作成してオブジェクト内のクラスレベルの変数名をオーバーライドしない限り、私は同じことを常に指します。Pythonでクラス変数をどのように参照する必要がありますか?

私の質問は、より良い習慣ですか?それとももっと共通?

いずれの方法でもコーディングの本とソースコードを参照してください。場合によっては、同じクラス内の変数を参照するために両方のメソッドを使用しているのがわかりますが、これは本当に矛盾していると思います。ここで

私は例を提供します。

class Foo(object) : 
    class_var = ['same','for','all'] 
    def __init__(self, instance_var) : 
     self.instance_var = instance_var 
    def print_words(self) : 
     # here I could use self.class_var 
     for w in Foo.class_var : 
      print w 

答えて

4

あなたが唯一のクラスを持っているし、あなただけの変数を読めば、あなたは違いの多くは表示されません。 Foo.class_varは、その特定の値を具体的に参照するために継続する一方

アカウントにclass_varをオーバーライドするサブクラスの可能性を取る場合は、self.class_varは最初の現在のクラスになります。ベストプラクティスはあなたの意図にかかっていますが、クラスをオプションにする言語でクラスを使用すると、少なくとも多形性に関心があることを意味するので、selfがおそらくより一般的に役立ちます。

また、値を設定する場合は、self.whatever =がインスタンス変数を設定し、Foo.whatever =が他のインスタンスにも影響を与える可能性のあるクラス変数を設定します。

0

例からFoo.class_varを使用する際の問題は継承にあります。

class Bar(Foo): 
    class_var = ['other','one','here'] 

In [2]: a = Foo(['one']) 

In [3]: b = Bar(['one']) 

In [4]: a.class_var 
Out[4]: ['same', 'for', 'all'] 

In [5]: b.class_var 
Out[5]: ['other', 'one', 'here'] 

In [6]: b.print_words() 
same 
for 
all 

それが可能だ、これはあなたが望む動作ですが、私はそれは珍しいことだと思う:あなたはそれがあなたのFoo()クラスで始まる、ここに示され見ることができます。あなたは通常、selfの品種を使います。

関連する問題