pythonオブジェクト向け(1):クラスの基本概念


Pythonは解釈言語であるが,オブジェクト向けであり,オブジェクトプログラミングが可能である.次に、Pythonでオブジェクトプログラミングを行う方法について説明します.
一.クラスの定義方法
pythonオブジェクト向けのプログラミングを行う前に、クラス、クラスオブジェクト、インスタンスオブジェクト、プロパティ、関数、メソッドという用語をいくつか理解します.
クラスは現実世界のいくつかのもののパッケージであり、クラスを定義するには以下の方法で定義することができます.
class className:
    block

クラス名の後ろにコロンがあることに注意して、blockブロックの中で属性と方法を定義することができます.クラス定義が完了すると、クラスオブジェクトが生成されます.クラスオブジェクトは、リファレンスとインスタンス化の2つの操作をサポートします.リファレンス操作は、クラスオブジェクトによってクラス内の属性またはメソッドを呼び出し、インスタンス化は、インスタンスオブジェクトと呼ばれるクラスオブジェクトを生成するインスタンスです.たとえばpeopleクラスを定義します.
class people:
    name = 'jack'       #       
    #       
    def printName(self):        print self.name

peopleクラス定義が完了すると、クラス内の属性とメソッドにアクセスできるグローバルなクラスオブジェクトが生成されます.peopleを通過するとname(なぜ直接このようにアクセスできるのかは後述するが、ここではクラスオブジェクトという概念を理解すればよい)訪問質問の場合people.nameのpeopleをクラスオブジェクトと呼ぶのは,C++とは異なる.もちろん、インスタンス化操作も可能である、p=people()は、peopleのインスタンスオブジェクトを生成し、この場合もインスタンスオブジェクトpによって属性やメソッドにアクセスすることができる(p.name).
クラス、クラスオブジェクト、インスタンスオブジェクトの違いを理解した後、Pythonのプロパティ、メソッド、関数の違いを理解します.
上のコードでは、nameはプロパティであり、printName()はメソッドであり、あるオブジェクトにバインドされた関数をメソッドと呼びます.一般的にクラスで定義された関数はクラスオブジェクトまたはインスタンスオブジェクトにバインドされているので、メソッドと呼ばれます.クラス外で定義された関数は、一般的にオブジェクトとバインドされていないので、関数と呼ばれます.
二.ツールバーの
クラスでは、次のようなプロパティを定義できます.
class people:
    name = 'jack'
    age = 12

p = people()print p.name,p.age

名前とageのプロパティが定義されたpeopleクラスが定義され、デフォルト値は「jack」と12です.クラスを定義した後、インスタンス化オブジェクトを生成するために使用できます.このp=people()は、オブジェクトpをインスタンス化し、pによって属性を読み出すことができます.ここでのnameとageは共通であり,クラス外で直接オブジェクト名でアクセスでき,プライベートとして定義するには,前に下線''を2つ追加する必要がある.
class people:    __name = 'jack'
    __age = 12

p = people()print p.__name,p.__age

このプログラムの実行はエラーを報告します.
  
プライベート属性はクラス外でオブジェクト名でアクセスできないため、この属性が見つかりません.PythonではC++のpublicやprivateのようなキーワードは公有属性とプライベート属性を区別していません.属性名の前に下線''を2つ付けた場合、属性名で区別されます.は、この属性がプライベート属性であることを示し、そうでない場合は公有属性である(メソッドも同様で、メソッド名の前に下線が2つ付いている場合は、そのメソッドがプライベートであることを示し、そうでない場合は公有である).
三.方法
クラスでは必要に応じていくつかの方法を定義することができ、定義方法はdefキーワードを採用し、クラスで定義された方法には少なくとも1つのパラメータがあり、一般的には'self'という変数をこのパラメータとして(他の名前でもよい)、最初のパラメータとして必要である.次に例を示します.
class people:    __name = 'jack'
    __age = 12    def getName(self):        return self.__name
    def getAge(self):        return self.__agep = people()print p.getName(),p.getAge()

  
selfがよく理解できない場合は、C++のクラス内のthisポインタのように理解できます.オブジェクト自体の意味で、あるオブジェクトでメソッドを呼び出すと、そのオブジェクトを最初のパラメータとしてselfに渡します.
四.クラスに組み込まれたメソッド
Pythonには、2つの下線で始まり、2つの下線で終わります.クラスで最もよく使われるのは構造方法と解析方法です.
構築方法_init__(self,....)オブジェクトの生成時に呼び出すと、呼び出しを表示する必要がなく、デフォルトで実行される初期化操作に使用できます.コンストラクションメソッドはリロードをサポートし、ユーザー自身がコンストラクションメソッドを再定義していない場合、デフォルトのコンストラクションメソッドが自動的に実行されます.
プロファイルメソッド_del__(self)オブジェクトを解放するときに呼び出され、リロードがサポートされ、呼び出しを表示する必要がなく、リソースを解放する操作を行うことができます.
他にもいくつかの組み込み方法があります.
例えば_cmp__( ), __len( )__など、具体的な使い方はこのブログを参考にすることができます.
  http://www.cnblogs.com/simayixin/archive/2011/05/04/2036295.html
五.クラスプロパティ、インスタンスプロパティ、クラスメソッド、インスタンスメソッド、および静的メソッド
クラスの基本的なものを理解した後、pythonのいくつかの概念の違いを見てみましょう.
まず、クラス属性とインスタンス属性について説明します.
前述の例では、クラス属性に触れています.名前の通り、クラス属性はクラスオブジェクトが持つ属性であり、すべてのクラスオブジェクトのインスタンスオブジェクトに共有され、メモリにはコピーが1つしか存在しません.これはC++のクラスの静的メンバー変数と少し似ています.共通のクラスプロパティでは、クラス外でクラスオブジェクトとインスタンスオブジェクトからアクセスできます.
class people:
    name = 'jack'  #      
    __age = 12     #      p = people()print p.name             #  print people.name        #  print p.__age            #  ,                   print people.__age       #  ,                  

インスタンス属性は、クラスに定義を表示する必要はありません.たとえば、次のようにします.
class people:
    name = 'jack'p = people()
p.age =12print p.name    #  print p.age     #  print people.name    #  print people.age     #  

クラス外でクラスオブジェクトpeopleをインスタンス化した後、インスタンスオブジェクトpが生成され、p.age=12という文はpにインスタンス属性ageを追加し、12に割り当てます.このインスタンス属性はインスタンスオブジェクトp特有であり、クラスオブジェクトpeopleはそれを所有していないので(クラスオブジェクトでこのage属性にアクセスすることはできません).もちろん、オブジェクトをインスタンス化するときにageに値を割り当てることもできます.
class people:
    name = 'jack'
    
    #__init__()        ,           
    def __init__(self,age):
        self.age = age

p = people(12)print p.name    #  print p.age     #  print people.name    #  print people.age     #  

クラス外でクラスプロパティを変更する必要がある場合は、クラスオブジェクトを参照して変更する必要があります.インスタンス・オブジェクトを参照すると、同じ名前のインスタンス・プロパティが生成されます.この方法で変更されるのはインスタンス・プロパティであり、クラス・プロパティには影響しません.その後、インスタンス・オブジェクトを参照すると、インスタンス・プロパティが削除されない限り、インスタンス・プロパティが強制的にブロックされます.
class people:
    country = 'china'
    print people.country
p = people()print p.country
p.country = 'japan' print p.country      #              print people.countrydel p.country    #      print p.country

  
  
次に,クラスメソッド,インスタンスメソッド,静的メソッドの違いを示す.
クラスメソッド:クラスオブジェクトが持つメソッドです.修飾器'@classmethod'でクラスメソッドとして識別する必要があります.クラスメソッドの場合、最初のパラメータはクラスオブジェクトでなければなりません.一般的に「cls」を最初のパラメータとして使用します(もちろん他の名前の変数を最初のパラメータとして使用することができますが、ほとんどの人は「cls」を最初のパラメータの名前として使用することに慣れており、「cls」を使用することが望ましい)、インスタンスオブジェクトやクラスオブジェクトからアクセスできます.
class people:
    country = 'china'
    
    #   , classmethod         @classmethod    def getCountry(cls):        return cls.country

p = people()print p.getCountry()    #          print people.getCountry()    #         

クラス・メソッドのもう1つの目的は、クラス・プロパティを変更することです.
class people:
    country = 'china'
    
    #   , classmethod         @classmethod    def getCountry(cls):        return cls.country
        
    @classmethod    def setCountry(cls,country):
        cls.country = country
        

p = people()print p.getCountry()    #          print people.getCountry()    #         p.setCountry('japan')   

print p.getCountry()   
print people.getCountry()

実行結果:
  
結果は、クラス・メソッドでクラス・プロパティを変更した後、クラス・オブジェクトとインスタンス・オブジェクトのアクセスが変更されたことを示します.
  
≪インスタンス・メソッド|Instance Method|emdw≫:クラスで最も一般的に定義されているメンバー・メソッド.少なくとも1つのパラメータがあり、インスタンス・オブジェクトを最初のパラメータとして使用する必要があります.一般的には'self'という変数を最初のパラメータとして使用します(もちろん、他の名前の変数を最初のパラメータとして使用できます).クラス外のインスタンスメソッドは、インスタンスオブジェクトのみで呼び出すことができ、他の方法で呼び出すことはできません.
class people:
    country = 'china'
    
    #    
    def getCountry(self):        return self.country
        

p = people()print p.getCountry()         #  ,          print people.getCountry()    #  ,             

静的メソッド:修飾器'@staticmethod'で修飾する必要があります.静的メソッドではパラメータを多く定義する必要はありません.
class people:
    country = 'china'
    
    @staticmethod    #    
    def getCountry():        return people.country        

print people.getCountry()

 
クラス・プロパティとインスタンス・プロパティの場合、クラス・メソッドでプロパティが参照されている場合、そのプロパティは必ずクラス・プロパティであり、インスタンス・メソッドでプロパティが参照されている場合(変更せず)、同じ名前のクラス・プロパティが存在する場合、インスタンス・オブジェクトにインスタンス・プロパティがある場合、インスタンス・プロパティはクラス・プロパティをマスクします.つまり、インスタンス・プロパティが参照されています.インスタンスオブジェクトにその名前のインスタンス属性がない場合は、クラス属性が参照されます.インスタンス・メソッドでプロパティが変更され、同じ名前のクラス・プロパティが存在する場合、インスタンス・オブジェクトにインスタンス・プロパティがある場合は、インスタンス・プロパティが変更され、インスタンス・オブジェクトにインスタンス・プロパティがない場合は、同じ名前のインスタンス・プロパティが作成されます.クラスプロパティを変更するには、クラス外の場合はクラスオブジェクトで変更できますが、クラス内の場合は、クラスメソッドでのみ変更できます.
クラスメソッドとインスタンスメソッドおよび静的メソッドの定義形式から、クラスメソッドの最初のパラメータはクラスオブジェクトclsであり、clsによって参照されるのは必ずクラスオブジェクトの属性とメソッドであることがわかる.インスタンスメソッドの最初のパラメータがインスタンスオブジェクトselfである場合、selfで参照されるのはクラス属性である可能性があり、インスタンス属性である可能性があります(これは具体的な分析が必要です).ただし、同じ名前のクラス属性とインスタンス属性がある場合、インスタンス属性の優先度はより高くなります.静的メソッドではパラメータを追加定義する必要はありません.したがって、静的メソッドでクラス属性を参照する場合は、クラスオブジェクトで参照する必要があります.
オブジェクト向けプログラミングについてはしばらくお話ししますが、クラスの継承やメソッドの再ロードについては後述します.
変換元:http://www.cnblogs.com/dolphin0520/archive/2013/03/29/2986924.html