ディレクトリ
オブジェクト指向の知識仕上げレビュー
オブジェクト指向の基礎
中核オブジェクト指向プログラミングワードはオブジェクトであり、オブジェクトは、属性および方法の組み合わせであり、すべてがPythonで対象となっています。
利点:スケーラビリティ
短所:プログラミングの高い複雑
1、クラスとオブジェクト
オブジェクト:プロパティとメソッドの組み合わせ
クラス:杭のプロパティとメソッドの組み合わせ
Pythonはクラスの最初で、その後、実際の生活の中でオブジェクトを持って、そしてファーストクラスのオブジェクトがあります
クラス名は()クラスは、オブジェクトをインスタンス化することができる生成され
class Person:
school = 'xxx'
def __init__(self): # 对象初始化方法,对象的绑定方法,对象来调用会把对象传过来
self.name = 'xxx'
p = Person() # 类实例化产生对象会调用类的__init__方法
2、プロパティを見つけます:
- データ属性:オブジェクト自体は見つけること---「カテゴリ---」親(ソートに使用MROリスト)---「オブジェクトは---」間違った報告書ではなく、
- オブジェクト「のリストを表示して下さいMROに従って---親クラスを」Bindメソッドオブジェクト--- ---「間違ったレポートにありません:メソッドの検索
図3に示すように、結合方法
- クラスが定義されている内に、関数は、任意の装飾が施されるべきではない、方法であります
- オブジェクトに使用する:オブジェクト自体の上にオブジェクトメソッド()デフォルトのパス
- コールするクラスは、複数の値を渡すためにいくつかの値がありますが、通常の関数であります
図4に示すように、オブジェクト間の相互作用:
- 別のオブジェクトに渡されたオブジェクト、オブジェクトが----例銃撃戦人と犬の前に運転を書きます
内蔵の性質5、クラス
-クラス名__name__
:クラス名(文字列)
-クラス名__doc__
:クラスのドキュメンテーション文字列
-クラス名__bases__
:すべての親クラスのクラス
-クラス名__base__
:親クラスのファーストクラス
-クラス名__dict__
:クラスの名前空間辞書(プロパティとメソッド)
-クラス名__module__
:クラスモジュール定義
-クラス名。__class__
:対応するクラスの例(唯一の新しいクラスがあります)
図6に示すように、三つの特徴:継承、多型、カプセル化
- 継承:
- カンマで区切られた、クラス名の後の括弧内のクラスを継承するために書きます
--pyサポート多重継承(属性検索順)
- モダンでクラシッククラス
- 新しいクラスは、オブジェクトのクラスを継承して呼び出す(すべての新しいクラスでPY3)
唯一の新しいスタイルのクラス、引数の古典的なソート--py2
- ダイヤモンドの問題に順序を探します
- 新しいカテゴリ:幅優先
- クラシック:深さ優先
--mroリスト
--super()特別なオブジェクト(MROリストを見つけるに厳密に従って)親クラスのプロパティおよびメソッドを呼び出します
MROに従い、検索リストの現在の場所から自己が根本的に見つけなければならない、スーパー():--selfとスーパーの違い
- 通常の関数でクラスメソッドの名前()、これはソートMROのリストを使用しますが、名前を命名の使用されていません
- 派生:サブクラス余分なプロパティとメソッド
- 多型と多型
- 多型:物事の様々な形態
- 多型:同じことを同じ方法を実行し、明らかに結果は同じではありません
- 2つの制限方法サブクラスは、どのような方法を実装する必要があります。
- モジュールのABC
- レイズは例外
- アヒルの種類:アヒルのように歩き、あなたはアヒルです
- lenは()実際にオブジェクトを呼び出しています。__len__
()
- パッケージ
- 隠されたプロパティとメソッド
- __始めると、非表示になります
- 私は実際には隠さない(性別の変更を行います)
- プロパティを隠す:データのセキュリティを確保するために、
- 隠蔽方法:分離の複雑さ
- プロパティデコレータ:データがパッケージに属性
- 他の二つのデコレータ
- クラスメソッド:クラスの結合方法、クラスが着信クラス(オブジェクトも呼び出すことができる)に自動的に起動することができます
- staticmethod:誰でも呼び出すことができる静的メソッド、自動的にパラメータを渡すことはありません。
第二に、オブジェクト指向の高位
元类
メタクラスの概念:すべてのオブジェクトであるため、クラスは、クラスをインスタンス化することができ、したがって、オブジェクト、元クラスのコンストラクタクラス、およびクラスメタクラスを取得するためにされています
タイプは、ほとんどのトップレベルのメタクラスです
PY3すべてのクラスが(のメタクラスタイプが継承さpbject含む)オブジェクトから継承され
オブジェクトクラスは、メタクラスの種類によって作成され、型クラスは、メタクラスのタイプによって作成されます
カスタム元クラス:クラスの継承されたタイプは、メタクラスと呼ばれるので、私たちは、元のクラス(クラスPersonをカスタマイズすることができます(メタクラス= Mymeta)私のカスタムメタクラス指定されています
class Mymeta(type): # 通过重写__call__来控制对象的产生 def __call__(self,*args,**kwargs): # 这个会在类加括号(实例化产生对象)的时候触发,用来控制对象的创建 # 第一步:调用Person类的__new__方法,来产生一个空对象 # obj=object.__new__(self) obj = self.__new__(self) # 推荐使用这种方式来创造空对象,以为这种方式会检索类和类的父类,而object.__new__则是直接跨过了他们三个 # 第二步:调用Person类的__init__,完成对象初始化 obj.__init__(*args,**kwargs) # 这里写初始化对象的语句 # 第三步:返回初始化好的对象 return obj pass def __new__(cls,name,bases,dic): # 控制类的产生 # 产生空对象(空类),在这里面生成的其实并不是空类,是有数据的类了 # 这里写修改类的名称空间的代码,通过修改dic来控制产生的类的名称空间 _class=type.__new__(cls,name,bases,dic) # 完成类的初始化,并且把name,bases,dic这些东西放入 return _class # 把产生的类返回出来 pass # Mymeta(name,bases,dic)实例化产生类,会调用type的__call__,内部调用Mymeta的__new__和__init__, def __init__(self): # 控制类的初始化 pass class Person(metaclass=Mymeta): pass
__new__
そして、__init__
の間の差図1に示すように、
__new__
空のオブジェクト(クラスオブジェクトである)を作成図2に示すように、
__init__
オブジェクトを初期化します元类中:
1、カスタムメタクラス書き換える
__call__
方法:クラス定義されたメタクラスから生成された制御オブジェクトを作成するためにインスタンス化生成します2、カスタムメタデータクラスの書き換え
__new__
方法を:ほとんどのルートはコントロールクラスを生成し、実際には、最も基本的な性質は、それは、ないメタクラスタイプです__call__
が、私たちはタイプを変更することはできません、我々は唯一のメタクラスカスタム書き換えることができます__new__
方法図3は、カスタムのメタクラス書き換え
__init__
生成されたクラスは、クラスをインスタンス化されたカスタムコントロール要素を作成しますが、次のとおりです。メソッドを__new__
後に。プロパティは、メタクラス検索順序を持っていた後、
オブジェクトレイヤー:見つけるために、オブジェクトそのもので始まる---親クラスのMROリストで検索し、「検索する---カテゴリ」---「ではない間違った報告書に
クラスレベル:「リストを見つけるMROことで親クラスを---」を見つけるために---クラス自身で始まるカスタム見つけるメタクラス---「メタクラスを見つけるために、入力し---」ではない間違った報告書に
issubclass和でisinstance
--issubclass():最初のカテゴリが決定される第二のクラスのサブクラスではない、結果が真であるか偽であります
--isinstance():オブジェクトの最初のパラメータが判定されていない第二のパラメータ(複数も可)、結果が真であるか偽であります
リフレクション(文字列を取得することで、変更、オブジェクトのプロパティやメソッドを削除します)
- はhasattr():オブジェクト内の属性は、TrueまたはFalseはhasattrを返すかどうかを判断する(オブジェクト属性)
- GETATTR():対応するプロパティまたはメソッドを取得するために、プロパティメソッドまたは文字列を取得GETATTR(オブジェクトのプロパティまたはメソッド)を返します
- SETATTR():文字列によってSETATTRプロパティやメソッドを設定します(オブジェクト、「名前」の方法、メソッド名)
- delattr():文字列プロパティまたはメソッドdelattr(オブジェクトのプロパティまたはメソッド)を削除
組み込みメソッド(マジックメソッド)
ポイントインターセプト法:オブジェクトメソッドがトリガーされます
-
__getattr__
:オブジェクトが追加.
処理ができなく進むと、値を取得します-
__setattr__
:オブジェクトプラス.
割り当て、あなたが方法を入力に失敗したら、-
__delattr__
:オブジェクトプラス.
値を削除し、方法を入力します。
シングルトン
コンセプト:ポイントの複数のインスタンスが同じオブジェクトを取得するには、同じメモリアドレスであります
利点:スペースを節約
シングルモードの実施形態を達成するための4つの方法
1、シングルトンの方法を実装する結合定義されたクラス
図2に示すように、装飾的な実装シングルトンを定義します
3、メタクラスを定義するシングルトンを実装
単一ブロックの実施の形態(モジュールPythonの自然シングルトン)を導入することにより4、