クラスとインスタンス
クラスとインスタンス
クラス(は、クラスにデータをカプセル化し、定義関数を使用してクラス内のデータを操作することで、データのセキュリティを保護し、データの有効性を検出することができます.クラスまたはインスタンスのデータを属性( プロパティまたはメソッド名の前後に、 プロパティまたはメソッド名の前に下線を引きます.
注意:実はこの書き方の属性や方法は外部で直接アクセスできるが、個人的な見方として約束されているだけで、言語レベルから定義されていない.
プロパティまたはメソッド名の前に2つの下線を引きます.
注意:実はこの書き方も本当に外部の直接アクセスを拒否することはできません.ただ、解釈器は属性名を
クラス属性とインスタンス属性
クラスオブジェクト属性とインスタンスオブジェクト属性は2つの異なる概念です.
クラス属性はクラスオブジェクトが持つ属性で、すべてのクラスオブジェクトのインスタンスオブジェクトに共有され、メモリには1つのコピーしかありません.クラスプロパティは、クラスオブジェクトとインスタンスオブジェクトからアクセスできます.
インスタンスオブジェクトのプロパティには定義を表示する必要はありません.同じクラスのインスタンスオブジェクト間のプロパティはそれぞれ独立しており、メモリは共有されていません.インスタンスオブジェクトのプロパティを変更しても、クラスプロパティや他のインスタンスオブジェクトのプロパティには影響しません.
クラスオブジェクトが参照してアクセスするのは、クラス属性に違いありません.インスタンスオブジェクトが属性を参照する場合は、2つのケースに分けられます.は、インスタンス属性がその属性と同名である場合、インスタンス属性を参照するように変更しない.存在しない場合は、同じ名前のクラスプロパティを参照します. インスタンス属性が同じ名前の場合、インスタンス属性を変更します.存在しない場合は、このプロパティをインスタンスプロパティに追加します.
クラスプロパティを変更するには、クラス内でクラスメソッドまたはクラス外参照クラスオブジェクトを介してクラスメソッドを呼び出す2つの方法があります.クラス外でのクラスオブジェクト属性の変更は、クラスオブジェクトを参照することによってのみ実現できます.インスタンスオブジェクトを参照して変更すると、同じ名前のオブジェクトプロパティと同じ名前のインスタンスプロパティが生成され、インスタンスオブジェクトを参照すると、インスタンスプロパティがクラスプロパティ、すなわちインスタンスプロパティを強制的にブロックします.
クラスメソッドとインスタンスメソッド
クラスメソッドはクラスオブジェクトが持つメソッドであり、そのクラスメソッドを表すには装飾器
インスタンスメソッドは各インスタンスに属し、クラス外ではインスタンスオブジェクトのみで呼び出されます.
クラス(
class
)はオブジェクト向けプログラム設計の重要なデータ型であり、パッケージ、マルチステート、継承の3つの特徴を有する.クラスは抽象的な概念であり、インスタンス(instance
)はクラスの具体的なオブジェクトであり、同様にクラスの特徴を有する.attr
)と呼び、クラスまたはインスタンスの操作データの関数を方法(method
)と呼ぶ.python
には、外部からクラスやインスタンスに直接アクセスすることを拒否する属性や方法を絶対的に保証するメカニズムはありません.プログラムを作成する過程で、プログラマがこの原則を自覚的に遵守する必要があり、属性と方法の命名方式もこの仕事に協力しています.class new_class(object):
def __init__(self,x,y):
self._abc = x
self.__abc = y
obj = new_class(1,2)
obj._abc
obj.__abc
__init__
などの下線を2本ずつ付けて、そのプロパティまたは特殊なプロパティを示します.コードを書くときは、このような書き方を使用してプロパティまたはメソッドを定義しないでください._abc
のように、このプロパティまたはメソッドはプライベートとして扱われるべきであり、クラスまたはインスタンス以外で直接参照しないでください.注意:実はこの書き方の属性や方法は外部で直接アクセスできるが、個人的な見方として約束されているだけで、言語レベルから定義されていない.
__abc
のように、プロパティまたはメソッドが外部から直接アクセスできないことを示します.直接アクセスするとAttributeError
タイプの例外が表示されます.注意:実はこの書き方も本当に外部の直接アクセスを拒否することはできません.ただ、解釈器は属性名を
obj._new_class__abc
に変えました.クラス属性とインスタンス属性
クラスオブジェクト属性とインスタンスオブジェクト属性は2つの異なる概念です.
クラス属性はクラスオブジェクトが持つ属性で、すべてのクラスオブジェクトのインスタンスオブジェクトに共有され、メモリには1つのコピーしかありません.クラスプロパティは、クラスオブジェクトとインスタンスオブジェクトからアクセスできます.
#
class People(object):
# ,
population = 0
# ,
__population = 0
#People() ( ), p
p = People()
#
People.population
# , , AttributeError
People.__population
#
p.population
#
p.__population
インスタンスオブジェクトのプロパティには定義を表示する必要はありません.同じクラスのインスタンスオブジェクト間のプロパティはそれぞれ独立しており、メモリは共有されていません.インスタンスオブジェクトのプロパティを変更しても、クラスプロパティや他のインスタンスオブジェクトのプロパティには影響しません.
クラスオブジェクトが参照してアクセスするのは、クラス属性に違いありません.インスタンスオブジェクトが属性を参照する場合は、2つのケースに分けられます.
クラスプロパティを変更するには、クラス内でクラスメソッドまたはクラス外参照クラスオブジェクトを介してクラスメソッドを呼び出す2つの方法があります.クラス外でのクラスオブジェクト属性の変更は、クラスオブジェクトを参照することによってのみ実現できます.インスタンスオブジェクトを参照して変更すると、同じ名前のオブジェクトプロパティと同じ名前のインスタンスプロパティが生成され、インスタンスオブジェクトを参照すると、インスタンスプロパティがクラスプロパティ、すなわちインスタンスプロパティを強制的にブロックします.
クラスメソッドとインスタンスメソッド
クラスメソッドはクラスオブジェクトが持つメソッドであり、そのクラスメソッドを表すには装飾器
@classmethod
を使用する必要がある.クラスメソッドは、クラスオブジェクトまたはインスタンスオブジェクトで参照できます.@classmethod
# cls
def getPopulation(cls):
return cls.population
インスタンスメソッドは各インスタンスに属し、クラス外ではインスタンスオブジェクトのみで呼び出されます.