Python ソースコードでオブジェクトの作成とオブジェクトの動作を学習する

巴扎黑
リリース: 2016-12-07 11:24:37
オリジナル
1234 人が閲覧しました

オブジェクトの作成と動作について説明する前に、まず型オブジェクトについて見てみましょう。Python は型が弱い言語ですが、Python に型が存在しないというわけではありません。 Python では、タイプ オブジェクトと呼ばれます。オブジェクトのタイプが分からない場合、オブジェクト用のメモリ空間を開くことはできません。これは、占有されるメモリのサイズがオブジェクトのメタ情報であり、基本情報であるためです。これはオブジェクトのタイプと密接に関係しているため、対応するタイプのオブジェクトについては、Python ソース コードの include フォルダーにある object.h ファイルを開きます。 PyTypeObject のソース コード 324 行目あたり:


typedef struct _typeobject {
PyObject_VAR_HEAD
const char *tp_name /* 形式 "." */
Py_ssize_t tp_basicsize, tp_itemsize ; /* 割り当て用 */

/* 標準操作を実装するメソッド */
printfunc tp_print ;
cmpfunc tp_compare;
reprfunc tp_repr;

/* のメソッドスイート標準クラス */

PyNumberMethods *tp_as_number;
PySequenceMethods *tp_as_sequence;
PyMappingMethods *tp_as_mapping; /* 追加の標準操作 (バイナリ互換性についてはこちら) */

hashfunc tp_hash; ternaryfunc tp_call
reprfunc tp_str; tp_getattro;
setattrofunc tp_setattro;

/* 入出力バッファーとしてオブジェクトにアクセスする関数 */
PyBufferProcs *tp_as_buffer / * オプション/拡張機能の存在を定義するフラグ */
long tp_flags;文字 * tp_doc; /* ドキュメント文字列 */

/* リリース 2.0 で割り当てられた意味 */
/* アクセス可能なすべてのオブジェクトの関数を呼び出す * /
traverseproc tp_traverse; /* 含まれるオブジェクトへの参照を削除する */
recruit tp_clear;
/* リリース 2.1 で割り当てられた意味 */
/* 豊富な比較 */
richcmpfunc tp_richcompare;

/* 弱参照イネーブラー * /
Py_ssize_t tp_weaklistoffset;
/* リリース 2.2 で追加 */
/* イテレーター */
getiterfunc tp_iter;
iternextfunc tp_iternext;
struct PyMethodDef *tp_methods;
struct PyGetSetDef *tp_getset; struct _typeobject *tp_base;
PyObject *tp_dict; tp_descr_get;
descrsetfunc tp_descr_set;
initproc tp_alloc
freefunc tp_free; mory ルーチン */
問い合わせ tp_is_gc /* PyObject_IS_GC の場合 */
PyObject *tp_bases;
PyObject *tp_mro; /* メソッド解決順序 */
PyObject *tp_subclasses;
デストラクター tp_del; /* バージョン 2.6 で追加されました。
unsigned int tp_version_tag;

#ifdef COUNT_ALLOCS
/* これらは最後に初期化する必要があります */
Py_ssize_t tp_allocs;
Py_ssize_t tp_maxalloc;
struct _typeobject *tp_prev;
struct _typeobject *tp_next;
} PyTypeオブジェクト
上記のコードは非常に長く、構造体あたり 100 行を超えていますが、含まれる情報は主に次の 4 つのカテゴリに分類されます:
1. 型名 tp_name は、主に Python の内部およびデバッグ中に所有権を識別するために使用されます。オブジェクトタイプの
2. tp_basicsize および tp_itemsize、このタイプのオブジェクトを作成するために割り当てられたメモリ空間のサイズに関する情報 (tp_base やその他の関数へのポインターなど)。 4. 型オブジェクトの型情報。

重要なポイント 1. オブジェクトの作成:
Python でオブジェクトを作成するには、Python C API と PyInt_Type という 2 つの主な方法があります。
Python C API を使用すると、ユーザーは C 環境から Python を操作できます。1 つは汎用 API である AOL (Abstract Object Layer)、もう 1 つは型である COL (Concrete Object Layer) です。 API; AOL には両方の機能があります PyObject_*** の形式は、一般に PyObject* intObj = PyObject_new(PyObject,&PyInt_Type) のように表現され、COL の API は次のようになります。 intObj = PyInt_FromLong (1000); 1000 個の整数オブジェクトが作成されます。
どの Python C API が使用されても、Python は最終的にメモリを直接割り当てます。これらはすべて Python の組み込みオブジェクトであり、クラス MySelf (オブジェクト) のようなクラスを自分で定義した場合、Python は API を使用してメモリを割り当てません。 create ですが、Python は MySelf に対応する型オブジェクトを通じてインスタンス オブジェクトを作成します。MySelf の型オブジェクトはオブジェクトなので、Python はオブジェクトを通じて MySelf のインスタンス化オブジェクトを作成します。次のコードを実行します。

class A(object):
pass
a = A()
type(a)
A.__base__
結果は次のようになります。

実際、Python は最初にオブジェクトをインスタンス化し、オブジェクトの構築メソッドを実行してから、A をインスタンス化します。これは、Python の基礎となる実装と密接に関連しています。ユーザー定義の Python クラスは、最終的には共通の親クラス オブジェクトを持ちます。インスタンス化するときは、最初にオブジェクト クラスがインスタンス化され、次にユーザー定義クラスがインスタンス化されるまで下位にインスタンス化されます。
スクリーンショット 2014-06-14 at 12.01.15

オブジェクトの動作:
オブジェクトの操作情報には、PyNumberMethods、PySequenceMethods、および PyMappingMethods 関数を指す、tp_as_number、tp_as_sequence、tp_as_mapping という 3 つの非常に重要な操作ファミリー グループがあります。それぞれの家族。オブジェクトの場合、3 つの関数ファミリーのすべての演算を同時に定義できます。つまり、オブジェクトは数値オブジェクトの特性と関連オブジェクトの特性を示すことができます。コードは次のとおりです。


class MyInt(int) ):
def __getitem__(self , Key): t Return Key+Str (SELF)
A = MyINT (1)
B = MyINT (2)
Print A+B
Print A ['Key'] 3
key1
最後に、type オブジェクトの型について説明します。オブジェクトの型もオブジェクトなので、このオブジェクトの型は何でしょうか?まず第一に、彼もオブジェクトであると判断できます。これらをタイプのタイプと呼びます。これは、ソース コードの PyType_Type 構造です。これは、objects フォルダーの typeobject.c ファイルにあります。ソース コードは次のとおりです。

PyTypeObject PyType_Type = {
PyVarObject_HEAD_INIT (&pytype_type、0)
"type"、/ * tp_print */
0、    0, /* tp_setattr */
0, /* tp_compare */
(reprfunc) type_repr, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
(hashfunc)_Py_HashPointer, /* tp_hash */
(ternaryfunc)type_call, /* tp_call */
0, /* tp_str */
(getattrofunc)type_getattro, /* tp_getattro */
(setattrofunc)type_setattro, /*セタトロ*/
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | 
Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS, /* tp_flags */
type_doc, /* tp_doc */
(traverseproc)type_traverse, /* tp_traverse */
(問い合わせ)type_clear, /* tp_clear */
type_richcompare, /* */
offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
    type_methods, /* tp_methods */
type_members, /* tp_members */
type_getsets, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
type_init, /* tp_init */
0 , /* tp_alloc */
type_new, /* tp_new */
PyObject_GC_Del, /* tp_free */
(問い合わせ)type_is_gc, /* tp_is_gc */
}; 
これは、PyInt_Type と PyType_Type の間でどのように関係するかを示しています。これは、前の博客での参照カウンタであり、全体的なオブジェクトの実行時間は次の図に示すとおりです。 32 .09

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート