2017-01-26 14 views
1

私はいくつかの属性を持つクラスを持っています。メソッドを使いたいです。それを使用する最もpythonicな方法は何ですか?これらのスタイルの問題について私が読むことができるドキュメントはありますか?私は、問題のこの種の問題を解決するためにpylintとpep8を使用しますが、私が正しく、この2ケースを理解同じであれば、これらのプログラムは、属性クラス定義の属性を持つPythonスタイル

class A(object): 
     BLOCK_SIZE = 8192 

     def func1(self): 
       print self.BLOCK_SIZE 
     def func2(self): 
       print A.BLOCK_SIZE 

で、この例ではすべてのエラーを表示しませんが、私はしないでください クラス名を参照したり、自己参照を使用する方が良いかどうかを知ってください。

ありがとうございました

答えて

3

selfをお勧めします。

フィールドには、クラス変数とオブジェクト変数の2種類があります。

クラス変数は、そのクラスのすべてのオブジェクト(インスタンス)によってアクセスされるという意味で共有されます。クラス変数のコピーのみがあり、いずれかのオブジェクトがクラス変数を変更すると、その変更は他のすべてのインスタンスにも反映されます。

オブジェクト変数は、クラスの個々のオブジェクト/インスタンスによって所有されます。この場合、各オブジェクトは、フィールドのそれ自身のコピーを有する。すなわち、それらは共有されず、同じクラスの異なるインスタンス内の同じ名前によってフィールドにいかなる形でも関連しない。

A.BLOCK_SIZEを使用すると、self.BLOCK_SIZEを使用してクラス変数を取得すると、特定のオブジェクトの属性が取得されます。

詳細な例と説明を確認するには、これをチェックします。 https://www.ibiblio.org/g2swap/byteofpython/read/class-and-object-vars.html

+0

さらに、すべての大文字は大域定数にのみ使用してください。 – MKesper

+0

私はPEP8でこのようなことは覚えていませんが、Djangoスタイルのガイドによれば、クラス内で大文字の変数を使用することは可能です。 –

+0

また、PEP8によると、グローバル変数の命名規則は関数の命名規則と同じです。 https://www.python.org/dev/peps/pep-0008/#global-variable-names –

1

class属性は、インスタンス属性のデフォルト値として多かれ少なかれ使用できます。この言語により、インスタンスが同じ名前の属性を持たない場合は、クラス自体またはクラスのインスタンスからクラス属性を読み取ることができます。

書き込みアクセスの場合は、A.BLOCK_SIZE=16384はグローバルクラス属性を変更し、self.BLOCK_SIZE=16384は同じ名前のインスタンス属性を作成(または更新)します。ここで

は、あなたのクラスではほとんど例です。

>>> a = A() 
>>> a.func1()    # access the class attribute 
8192 
>>> a.func2()    # access the class attribute too 
8192 
>>> a.BLOCK_SIZE=4096  # create an instance attribute of same name 
>>> a.func1()    # access the INSTANCE attribute 
4096 
>>> a.func2()    # still access the class attribute 
8192 

それは、クラス名に依存していると、インスタンスごとの上書きができていないので、あなたが共通circonstances下のインスタンスのセマンティクス(self.BLOCK_SIZE)を使うべき理由だこと。

クラスのセマンティクスA.BLOCK_SIZEは、class属性を変更する場合、またはインスタンス属性が存在する場合でもclass属性を使用する必要がある場合にのみ使用してください。

関連する問題