ホームページ  >  記事  >  バックエンド開発  >  Python でのメタクラスの作成と使用

Python でのメタクラスの作成と使用

高洛峰
高洛峰オリジナル
2017-03-01 13:47:361500ブラウズ

Python では、type 関数を使用してメタクラスを動的に作成することもできます。また、__metaclass__ 属性を使用してメタクラスを指定することもできます。次に、Python でのメタクラスの作成と使用について具体的な例を挙げて説明します

メタクラス。特定のクラスの作成方法を定義できます。基本的に、クラスの作成方法を制御できるようになります。
メタクラスもクラス、型クラスです。

メタクラスは通常、クラスを作成するために使用されます。クラス定義を実行するとき、インタープリターはこのクラスの正しいメタクラスを知っている必要があります。この属性が定義されていない場合は、親クラスの __metaclass__ 属性を検索します。まだ見つからない場合は、グローバル変数を探します。

従来のクラスの場合、そのメタクラスは types.ClassType です。

メタクラスにはコンストラクターもあり、クラス名、基本クラスから継承されたデータのタプル、クラス属性の辞書という 3 つのパラメーターを渡します。
以下のメタクラスを定義しましょう。これは、クラスを作成するときに、クラスに __str__() メソッドを提供する必要があります。 __repr__() メソッドが提供されていない場合は、
によって警告が表示されます。 type 関数は、次のような変数の型をチェックできます。

from warnings import warn
#元类需要继承type类
class ReqStrSugRepr(type):
  def __init__(cls, name, bases, attrd):
  #构造函数需要传递的参数为类名,基类,类属性字典
    super(ReqStrSugRepr, cls).__init__(name, bases, attrd)
    # 判断__str__字符串是否在类的属性字典里
    if '__str__' not in attrd:
      raise TypeError('Class requires overriding of __str__()')

    if '__repr__' not in attrd:
      warn('Class suggests overriding of __repr__()\n', stacklevel=3)

class Foo(object):
  #给类指定元类 
  __metaclass__ = ReqStrSugRepr

  def foo(self):
    pass
#这一段代码不用创建类来测试,直接运行一下就会报错,可见元类的功力。

オブジェクト

type は 3 つのパラメータ、name、base、dict を受け入れます。最初のパラメータはクラス名を受け入れ、2 番目のパラメータは親クラスを受け入れます。 (タプル形式)、そして 3 番目のパラメータは属性とメソッド (辞書形式) を受け入れますPython でのメタクラスの作成と使用

# <type &#39;int&#39;>
# <type &#39;str&#39;>
type(1)     
type(&#39;mink&#39;)

以下は関数を受け入れるメソッドです

X = type(&#39;X&#39;, (object,), dict(a=1))
# 等于
class X(object):
  a = 1

メタクラス

インスタンスオブジェクトができることは誰もが知っています。メタクラスはクラス オブジェクトを作成するクラスです。型はクラス オブジェクトを作成できます。これは、型がメタクラスであることを意味します。


メタクラス属性

メタクラスを使用してクラスオブジェクトを作成したい場合は、オブジェクトに __metaclass__ 属性を追加する必要があります。もちろん、メタクラスを通じてクラスの一部の特性を変更できるように、最初にメタクラスを用意する必要があります

def say(self):
  print &#39;hello&#39;

X = type(&#39;X&#39;, (object,), dict(say=say))
x = X()

# pirnt hello
x.say()

。上記は変数をプライベート変数に変更することです。

Python でのメタクラスの作成の詳細。 PHP 中国語 Web サイトの使用法に関する記事にも注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。