Python メタクラスの使用方法

php中世界最好的语言
リリース: 2018-04-09 15:57:02
オリジナル
1577 人が閲覧しました

今回はPythonのメタクラスの使い方と、Pythonメタクラスを使用する際の注意点を紹介します。実際の事例を見てみましょう。

今日の私の課題は、メタクラスとは何かを徹底的に理解することです。見てみましょう。

メタクラスを理解するには、オブジェクトから始めましょう。

Object (Object)

Python すべてはオブジェクトです、あなたはこの文を聞いたことがあるはずです(今聞いたことがあるでしょう)、数値はオブジェクトです、文字列はオブジェクトです、リストはオブジェクトであり、辞書もオブジェクトです。例:

>>> i = 10
>>> s = "abc"
>>> nums = [1,2,3]
>>> dicts = {"name":"zhang"}
ログイン後にコピー

等号の右側はオブジェクトであり、左側はこれらのオブジェクトに付けられた名前です。どのオブジェクトにも 3 つの主要な属性があります: ID、値。と入力します。

識別

識別は、個人の ID カード ID と同じであり、ライフサイクルを通して変化しません。コンピュータのメモリのアドレス。オブジェクトの ID は、関数 id() を通じて表示できます。

>>> id(i)
40592592
>>> id(s)
44980584
ログイン後にコピー

オブジェクトの値

オブジェクトの 2 番目の属性は値です。たとえば、i の値は 10、s の値は abc、nums の値は分かりやすいです。は1、2、3です。

オブジェクトのもう 1 つの重要な属性は型です。たとえば、上記の i の型は int 型から構築されます。整数。 s 型は文字列型、nums 型はリスト型、dicts 型はすべて対応する型から構築されます。

type() を通じてオブジェクトの型を確認できます。

>>> type(i)
<class &#39;int&#39;>
>>> type(s)
<class &#39;str&#39;>
>>> type(nums)
<class &#39;list&#39;>
>>> type(dicts)
<class &#39;dict&#39;>
ログイン後にコピー
オブジェクトの型もID識別子と同じで、一度決まると変更されません。

クラスと(インスタンス)オブジェクト

システムによって定義されている

整数型、文字列型、リスト、その他の型に加えて、キーワードで定義された独自の型を作成することもできます。クラス 。例:

>>> class Person:
  # 这里的 self 指某个实例对象自己
...  def init(self, name):
   # name 是实例的属性
...   self.name = name
  # live 是类的属性
  live = True
ログイン後にコピー
このクラスは抽象テンプレートであり、Zhang San や Li Si を参照しません。これで、このクラスを呼び出すことで具体的なテンプレートを構築 (インスタンス化) できます。名前付きのオブジェクトが出てきて、このオブジェクトをインスタンスオブジェクトと呼びます。

>>> p1 = Person("zhangsan")
>>> p1.name
'zhangsan'
>>>
>>> p2 = Person("lisi")
>>> p2.name
'lisi'
ログイン後にコピー
ここでの p1 と p2 は、インスタンス化後の (インスタンス) オブジェクトです。これら 2 つのオブジェクトの型は、クラスと (インスタンス) オブジェクトの関係です。車も同じです。

>>> p1
<main.Person object at 0x0195AA30>
>>> type(p1)
<class &#39;main.Person&#39;> # 这里的main是模块名称
ログイン後にコピー

クラスもオブジェクトです (クラスオブジェクトとも呼ばれます)

今、すべてがオブジェクトであり、インスタンス (実車) もオブジェクトであり、クラス (モールド) ももちろんオブジェクトであると言いました。存在するものでもあります。

Python インタプリタがキーワード クラス命令を実行すると、内部で「person」という名前のクラスが作成されます。このクラスもオブジェクトです (インスタンス間の違いに注意してください)。 ).オブジェクト)、ID、タイプ、および値もあります。例:

>>> id(Person)
26564024
>>> type(Person)
<class &#39;type&#39;>
>>> Person
<class &#39;main.Person&#39;>
ログイン後にコピー
この person クラス オブジェクトの型は「type」と呼ばれることに気付きました。これは、person クラスが型によって作成されることを意味します。ここで、p1 と p2 はインスタンス オブジェクトであり、person は であることを覚えておく必要があります。クラスオブジェクト。また、このタイプは一体何でしょうか?

おさらいしましょう、インスタンスオブジェクト p1 の型はクラスオブジェクト person であり、 person の型は type です

>>> nums = [1,2,3]
>>> type(nums)
<class &#39;list&#39;>
>>> type(list)
<class &#39;type&#39;>
ログイン後にコピー
nums は list であり、list の型も type であり、辞書クラス (dict) の型も type です、すべてのクラスの型 これらはすべて型です。つまり、すべてのクラスは型によって作成されます。この型はメタクラスです。Tao は 1 を生み出し、1 は 2 を生み出し、3 はすべてのものを生み出します。 (メタクラス自体もオブジェクトです)

现在我们都知道类(对象)可以使用 class 关键字创建,我们还知道类(对象)的类型是 type,既然知道了它的类型是 type,那么肯定可以通过 type(元类)来创建。

用元类创建类

前面讲到过,type 有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。

>>> Person = type("Person", (), {"live":True})
>>> Person
<class &#39;main.Person&#39;>
ログイン後にコピー

Person 就是一个类,它等价于:

>>> class Person:
...  live = True
...
>>> Person
<class &#39;main.Person&#39;>
ログイン後にコピー

用元类 type 创建类的语法是:

type(类名,基类元组(可以为空), 属性字典)

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Python实现求解最大公约数的方法

在python中numpy与array应该怎样转换

以上がPython メタクラスの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!