オブジェクト指向のpython -1

オブジェクト指向の考え方の利点1。

  利点:スケーラビリティ、共通のテンプレートを構築し、コードを簡素化

  考えた:オブジェクトをインスタンス化することにより、テンプレートとしてクラス、テンプレートオブジェクト、何かをするオブジェクト、抽象のものがあるが、コードを使用して表示されます反映

 

2.三つの特徴

  パッケージ(狭い):パッケージの属性、メソッドのパッケージ

  受け継ぎます 

    1.すべてのサブクラスは、プライベートコンテンツに加えて、親クラスを持っています

    サブクラス2.オブジェクト - スーパークラスのメソッド-...彼らが必要とするプロパティを見つけます

    3.py3のデフォルトは連続の多重継承の順序を表示するには、クラス名を決定するために、オブジェクトがC3アルゴリズムを使用して、新しいスタイルのクラスで、プリント(型.mro())継承しました

    4.super()。メソッドは、同じ名前の親クラスのメソッドを呼び出すことができます

クラスベース:
     デフ __init__ (自己):
         プリント' BASE ' 


クラスA(ベース):
     デフ __init__ (自己):
        スーパー()。__init__ ()
         プリント' A ' 


、クラスB(塩基):
     デフ __init__ (自己):
        スーパー()。__init__ ()
         プリント' B ' 


クラスC(A、B):
     デフ __init__ (自己):
        スーパー()。 __init__ ()
         プリントC 


C()

プリント(C.mro())  アルゴリズムの順序に従って、連続の順序は、クラスを決定

  ポリモーフィズム

 

3.メンバー

  プロパティ(__dict__ビュー)

    オブジェクトのプロパティ

    プロパティのクラス

  メソッド(DIR()ビュー)

    一般的な方法

    クラスメソッド:@classmethod 

    静的メソッド:クラスの通常の機能を@staticmethod

  プロパティ(メソッド迷彩プロパティ)

    多くの方法が運動とは異なり、結果を得た後に実行されています

    @property#変装プロパティ

    入力値による方法の#1 @名.Setter、戻り値のプロパティを変更します

  プライベートメンバー

    変数やメソッドは、プライベートクラスメソッド、私有財産のオブジェクト、内部、私有財産呼び出すことができます

  自己与のCLS

    自己パラメータは、オブジェクト自体、オブジェクトがインスタンス化されるとき、オブジェクトが呼び出されたときに、自己のメモリアドレス

    CLSパラメータは、クラスそのものであります

クラスパーソン:
    ローカル = ' 地球' 
    プライベートクラス属性
    __character__ = ' ' 

    DEF  __init__ (セルフ、名前、AD、HP、文字):
        self.name = 名前
        self.ad = AD 
        self.hp = HP
         プライベートオブジェクトをプロパティ 
        。自己__character__ = 文字

    プライベートクラスメソッドの
    DEFの __local__ (CLS):
         印刷(CLS。__character__ 

    #のクラスメソッド
    @classmethod
     デフDictの(CLS):
         リターン CLS。__dict__ 

    静态方法
    @staticmethod
     DEF 合計(N):
         リターン N + 2 属性情報    @property
     DEF 情報(自己):
         戻り' {} - {} - {} ' .format(self.name、self.ad、自己.HP) 修改属性情報    @ Info.setter
     デフ情報(自己、値):
         もし値<100 
            self.ad = 値の印刷。(人__character__ 

    
 

    



プリント(Person.Dict())
 プリント(Person.Sum(2 ))

OBJ1 =人(' ルーシー'、10、50、' アクティブ左' プリント(obj1.Info)
obj1.Info = 99
 プリント(OBJ1。インフォ)

 

4.オブジェクトの振る舞い

  オブジェクトをインスタンス化します

    スペースを開放するためにメモリ内のオブジェクトを作成するための1つの.__ new__方法

    2.オブジェクトの初期化方法を実行__init__

  オブジェクトは、オーダーのプロパティとメソッドを呼び出します

    メモリ内の優先順位を見ると - >パッケージの内部オブジェクト - >クラス - >親を

 

5.クラスとクラス間の関係

  依存性:低い相互依存関係は、通常、オブジェクトパラメータによって呼び出され、アクションを実行する必要がある場合、あなたはクラスを完了を助けるために他の方法を属性する必要があるクラス

 

:食べるクラス
:DEFハンドラ(自己、*引数)
:私のために引数に
i.eat()


クラスAppleは:
デフを食べる(自己):
プリント( '吃苹果')


クラス梨:
DEF(自己)を食べる:
プリント(」吃梨')


OBJ =()食べる
OBJ1 =アップル()
obj2が=梨()
obj.handler(OBJ1、OBJ2を)

 

  関係:二つのことはお互いに関連していなければならないが、いくつかの特別な場合に変更と交換することができます。

 

クラス国:
デフ__init __(自己、名):
self.name =名前
self.pro_list = []

DEF add_pro(自己、プロ):
self.pro_list.append(プロ)

デフshow_pro(自己):
私のためにself.pro_listで:
プリント(i.name、i.cou)


クラスの省:
デフ__init __(自己、名前、国):
self.name =名前
self.cou =国


C1 =国( '火星国')

P1 =州( '省1 」、C1.name)
P2 =州( '省2'、C1.name)

C1.add_pro(P1)
C1.add_pro(P2)

C1.show_pro()

  継承:非プライベートプロパティは親クラスを継承している親クラスを探して行くには時間がないとき、自己は、オブジェクトのプロパティを起動する方法を探します

 

6.インターフェース・クラス(抽象的制約)

  継承は、親クラスのサブクラスは、コードの重複を防止するためのコードを持って行うことができます、あなたはまた、唯一の関数インタフェースを記述するためにサブクラスによって継承され、インターフェース名(関数名)を定義し、インターフェイスクラスを定義することができ、連続しているインタフェースクラスを使用します

  抽象クラスは、インタフェース互換のインタフェースを定義し、呼び出し元の外にある詳細を心配する必要はありません。

クラス制約のサブクラスは持っている必要があります方法#インタフェース、およびパラメータの
クラスPay_Base:
:DEF(自己、マネー)有料
昇給NotImplementedError(「ペイが実施されなければならない」)を


クラスAlpay(Pay_Base):
DEF PAY2(セルフ、マネー):
印刷( 'アリペイ')


クラスWXpay(Pay_Base):
有料DEF(セルフ、マネー):
印刷( 'マイクロチャネルの有料')


クラスAPpay(Pay_Base):
有料DEF(セルフ、マネー):
印刷( 'リンゴの支払い')

支払い機能、インタフェース機能実行オブジェクトクラス制約
DEF有料(payobj、マネー):
payobj.pay(金)


P1 = Alpay()

有料(P1、100)

  

 7.反射

  これは、オブジェクトまたはクラスまたはモジュール、最初のパラメータ(オブジェクトまたはクラスまたはモジュール)を動作させるための文字列で反射され

  共通:

    メモリアドレス#を取得するためのゲッター()のgetattr(パラメータ1、 '文字列')

    hasattr()はhasattr(パラメータ1、 '列')#変数が存在するかどうかを判断します

インポートM1の
 クラスA:
    ローカル = ' 北京' 

    DEF  __init__ (セルフ):
         パス

    DEF datetime1で(自己):
         印刷' 時間' 

A1 = A() 

反映して、オブジェクトからプロパティを取得 
GETATTR(A1、= B ' ローカル' 

#のクラス属性からの反射によってテイク 
C = GETATTR(A、' ローカル' 

法により被写体からの反射を受ける 
D = GETATTR(A1、' datetime1で' 

モジュールからの反射によって、クラスBを取得する 
B = GETATTRを(M1、' B ' 
プリント(はhasattr(M1、 'B'))
E = B()

 

8.特殊ビス方法

  __str__と__repr__、理解していないが、メモリ・アドレスは、文字列オブジェクトに読み込むことができます

  __call__方法、ケースのオブジェクト+()メソッドが実行さ__call__

クラス:
DEF __init __(自己、名):
self.name =名前の

DEFの__str __(セルフ):
self.name戻る

DEF __call __(自己、引数*、** kwargsから):
印刷(引数、kwargsから)
引数を返すが、kwargsから

DEFを__ __repr(自己):
'をstrがのrepr実行されていない'を返す

A1は( 'ルーシー')=

__str__#オブジェクト実行方法
プリント(A1)

の__call__メソッドが実行
A1(1、2、3、 nは1 =、M = 2)

#__repr__直接オブジェクト実行メソッド
プリント(のrepr(A1))

がメソッドを見るどのように多くのオブジェクト
プリント(DIR(A1))

  __new__方法、新しいメソッドは、メソッド、オブジェクトベースクラスで、コンストラクタは、オブジェクトを作成するために、メモリを開放することです

クラスA:
     DEF  __new__ある(CLS、引数*、** kwargsから):
         印刷' 1 ' 
        cls.name = ' LOP ' 
        リターンオブジェクト。__new__です(CLS)  オブジェクトを作成するための基準obeject C言語の関数を

    DEF  __init__ (セルフ) :
         印刷2 


#のコンテンツを実行するステップ__new__方法、オブジェクトの名前、値A1に戻される
#のオブジェクト初期化するために実行されるステップの__init__ 
A1は= ()
 プリント(a1.name)
= A2を()
二つのオブジェクト#Falseのメモリを搭載した印刷(IS A1 A2)各

シングルトン## ##
クラスA:
__instance =なし

DEF(CLS、* argsを、** kwargsから)__を__new:
CLS .__インスタンスのIF ==なし:
CLS .__インスタンス=オブジェクト.__新しい新しい__(CLS)

記録メモリから#__instanceシングルトンオブジェクト
戻りCLS .__インスタンス

A = A1()
A2 = A()
印刷(IS A1 A2)

 

 

  

 

おすすめ

転載: www.cnblogs.com/quguanwen/p/11188722.html