Pythonデータモデル

1.データモデルを理解する方法は?

最近、Python言語機能に特化した本を読んでいました(この記事の内容の一部は** Fluent Python **という本からのものです)。データモデルという言葉が本の中で言及されています。データモデルは私たちがよく言うことですか?データの種類は?実際にはそうではありません。データモデルはPythonフレームワークの記述であり、独自のビルディングブロックのインターフェイスを規制します。これらのインターフェイスは、 __iter__ __len____del__などのPythonの特別なメソッドとして理解できます。これらのモジュールには、シーケンス、イテレーター、関数、クラス、およびコンテキストマネージャーが含まれますが、これらに限定されません。オブジェクトのどのメソッドとプロパティをシーケンスと呼ぶことができるかについて議論している場合、実際には、シーケンスのデータモデルについて議論しています。

**Pythonの最高の品質の1つは一貫性です。一定期間Pythonを使用すると、Python言語を理解し始め、新しい言語機能を正しく推測できるようになります。 ****

他のプログラミング言語の経験を持つPythonを使用している場合は、 object.len()ではなく len(object)に興味があるかもしれません。 Java言語では、object.len()がよく使用されます。このメソッドは、オブジェクトの長さを取得します。 この不快感の背後にある力をさらに理解すると、PythonデータモデルのAPIであるPythonデータモデルを構築した結果であるPythonの設計哲学に納得するでしょう。本物のPython機能を使用してオブジェクトを構築すると、ツールが提供されます。これは、 ** Pythonic ** **と呼ばれることがよくあります。 ****

どのフレームワークを記述しても、フレームワーク自体によって呼び出されるメソッドを実装するために多くの時間を費やします。Pythonフレームワーク自体も例外ではありません。 object [item]を使用している場合、実際にはバックグラウンドでメソッド object .__ getitem__を呼び出します。これの利点は何ですか。自分で作成したオブジェクトで []演算子を使用できるようにするために、クラスで __getitem__メソッドを定義するだけで済みます。

__ getitem__はPythonの特別なメソッドの1つです。一般的な特別なメソッドには、 __len__ __iter____enter__ __call__などがあります。

これらの特別なメソッドを使用すると、独自のオブジェクトで次の言語アーキテクチャを実装およびサポートし、それらと対話できます。

次に、独自のシーケンスクラスを実装します####

データモデルは、Python言語機能を使用してオブジェクトを構築するためのAPIを提供するため、独自のシーケンスクラスを実装しようとしています。

classMyList(object):
    
 def __init__(self,):
  self.items =[str(x)for x inrange(10)]
  self.len =10

 def __getitem__(self, item):return self.items[item]

 def __len__(self):return self.len

a =MyList()for x in a:print(x)print('最初の要素', a[0])print("長さ:",len(a))

自己定義クラスは、反復、スライス、および lenメソッドをサポートします。これは、実際にはPythonシーケンスを実装するプロトコル(非公式インターフェイス)です。組み込みのサブクラス化ではなく、データモデルを介してカスタムシーケンスを実装しました。実際にはアヒルモデルの言語であるシーケンスは、特定のクラスがアヒルのように動作する場合(ここではシーケンスを指します)、このクラスはシーケンスであると言えます。サブクラス化またはシリアルプロトコルのどちらで達成されるかは関係ありません。

特別なメソッドを使用することで、Pythonデータモデルを使用する利点をすでに理解できます。クラスのユーザーとして、標準操作のさまざまな名前(「長さを取得する方法」)を覚えておく必要はありません。.size()または.length( ) または、他の何か?)

上記の例では、 MyListクラスを繰り返してスライスすることができます。スライスの機能は、 __getitem__によって提供され、繰り返しの機能は、実際には、繰り返し可能なオブジェクトを返す __iter__によって提供されます。しかし、 MyListクラスには __iter__メソッドがありません。何が起こっているのでしょうか。

__iter__メソッドが実装されていないが、 __getitem__メソッドが実装されている場合、Pythonはイテレーターを作成し、要素を順番に取得しようとします(インデックス0から開始)。

ここで、 aオブジェクトを印刷しようとします

classMyList(object):
    
 def __init__(self,):
  self.items =[str(x)for x inrange(10)]
  self.len =10

 def __getitem__(self, item):return self.items[item]

 def __len__(self):return self.len

a =MyList()print(a)
>><__ main__.MyList object at 0x0000015AEAFC95F8>

その結果、私たちが気にしない一連のメモリアドレスが生成されますが、オブジェクトを直接印刷すると、一部のPython組み込みモジュールまたはサードパーティライブラリが、このようにではなく、理解できる情報になることがよくあります。メモリアドレス。

実際、これは文字列を返す特別なメソッド __str__によって実現できます。これは、特別なメソッド __str__MyListクラスに追加することで実現できます。

classMyList(object):

 def __init__(self,):
  self.items =[str(x)for x inrange(10)]
  self.len =10

 def __getitem__(self, item):return self.items[item]

 def __len__(self):return self.len

 def __str__(self):return','.join(self.items)

a =MyList()print(a)
>>0,1,2,3,4,5,6,7,8,9

3.lenが通常の方法ではない理由####

xが組み込み型のインスタンスである場合、len(x)は非常に高速になります。その背後にある理由は、CPythonがメソッドをまったく呼び出さずにC構造からオブジェクトの長さを直接読み取るためです。コレクション内の要素の数を取得することは非常に一般的な操作です。この操作は、str、list、memoryview、およびその他のタイプに対して効率的である必要があります。言い換えれば、lenが通常の方法ではない理由は、Python自身のデータ構造がバックドアを通過できるようにするためであり、absについても同じことが言えます。しかし、その特別な方法のおかげで、カスタムデータタイプにlenを使用することもできます。このアプローチは、組み込み型の効率を維持することと言語の一貫性を確保することのバランスを見つけ、「Python」の別の文を確認します。「特別なケースを特別なものにして、確立されたルールを破り始めることはできません。」

4つ、データモデルと特別な方法####

データモデルはオブジェクトプロトコルを記述し、特別なメソッドは組み込みオブジェクトによって実装されるプロトコルです。コードスタイルを組み込みタイプまたはより多くのPythonスタイルのコードと同じように動作させるために、代わりに特別なメソッドを使用できます。サブクラス化。

オブジェクトの基本的な要件は、適切な文字列表現が必要であるということです。この要件を満たすために、 __str__ __repr__を使用できます。 __repr__はデバッグに便利で、 __str__はエンドユーザーに適しています。これが、データモデルに特別なメソッド __repr__ __str__がある理由です。

Pythonには多くの特別なメソッドがあります。ここでの主なトピックはデータモデルです。Python言語の設計哲学を理解し、より多くの「Pythonic」コードを作成する方法について考えていただければ幸いです。

Recommended Posts

Pythonデータモデル
02.Pythonデータタイプ
Pythonデータ分析
pythonデータ構造
Pythonデータ形式-CSV
Pythonデータ分析-データ更新
Pythonデータ分析-関数の適用
Pythonデータ分析-データ選択
Pythonの基本的なデータタイプ
Pythonの基本的なデータタイプ
Pythonデータ分析-データ確立
Pythonデータサイエンス:ニューラルネットワーク
Pythonの一般的なデータ構造の照合
Python3クローラーデータクリーニング分析
Pythonは単純なXMLデータを解析します
Pythonデータサイエンス:ロジスティック回帰
Pythonのデータ構造とアルゴリズム
Pythonデータサイエンス:正規化方法
Pythonデータサイエンス:関連分析
Pythonデータサイエンス:線形回帰
PythonFakerデータ偽造モジュール
Pythonデータサイエンス:Chi-Square Test
Pythonはオンラインマイクロブログデータの視覚化を実現します
pythonはデータマイニングに適していますか
Pythonマルチスレッド
Python CookBook
Python FAQ
Python3辞書
python(you-get)
Pythonでデータ分析レポートを自動的に生成する
Python文字列
npy形式のデータ例へのPythonアクセス
Pythonの基本
Python記述子
Pythonの基本2
Python exec
Pythonノート
Python3タプル
CentOS + Python3.6 +
Python Advanced(1)
Python IO
Pythonマルチスレッド
Pythonツールチェーン
Python3リスト
Pythonマルチタスク-日常
Pythonの概要
Pythonアナリティック
Pythonの基本
07.Python3関数
Pythonの基本3
ビッグデータ分析用のJavaまたはPython
Pythonマルチタスクスレッド
Pythonはパンダを使用してExcelデータを処理します
Python関数
python sys.stdout
python演算子
Pythonエントリ-3
Centos 7.5 python3.6
Python文字列
pythonキューキュー
Pythonの基本4