type() を使用してクラスを動的に作成する
クラスもオブジェクトであるため、プログラムの実行中にクラスを作成できます。 Python は動的言語です。動的言語と靜的言語の最大の違いは、関數(shù)とクラスの定義がコンパイル時に定義されるのではなく、実行時に動的に作成されることです。前に、まず type() 関數(shù)を理解します。
まず、新しい hello.py モジュールを作成し、次に Hello クラスを定義します。
class Hello(object): def hello(self, name='Py'): print('Hello,', name)
次に、別のモジュールで hello モジュールを參照し、対応する情報を出力します。 type() 関數(shù)は、型と変數(shù)の型を表示するために使用されます。
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- from com.twowater.hello import Hello h = Hello() h.hello() print(type(Hello)) print(type(h))
出力結(jié)果は何ですか?
Hello, Py <class 'type'> <class 'com.twowater.hello.Hello'>
上で述べたように、 type() 関數(shù)は型または変數(shù)の型をチェックできます。Hello はクラス、その型は type、h はインスタンス、その型は com.twowater .hello 。こんにちは。前の com.twowater は私のパッケージ名で、hello モジュールはこのパッケージ名の下にあります。
ここでさらに詳しく考えてみましょう。上記の例では、type() 関數(shù)を使用して型または変數(shù)の型をチェックします。 Hello クラスの型がチェックされ、出力された結(jié)果は次のようになりました: <class 'type'> 。実際、type() 関數(shù)はオブジェクトの型を返すだけでなく、新しい型を作成することもできます。クラスの定義は実行時に動的に作成され、クラスの作成方法は type() 関數(shù)を使用します。たとえば、type() 関數(shù)を使用して上記の例の Hello クラスを作成できます。詳細(xì)については、次のコードを參照してください:
# -*- coding: UTF-8 -*- def printHello(self, name='Py'): # 定義一個打印 Hello 的函數(shù) print('Hello,', name) # 創(chuàng)建一個 Hello 類 Hello = type('Hello', (object,), dict(hello=printHello)) # 實例化 Hello 類 h = Hello() # 調(diào)用 Hello 類的方法 h.hello() # 查看 Hello class 的類型 print(type(Hello)) # 查看實例 h 的類型 print(type(h))
出力結(jié)果は次のとおりです:
Hello, Py <class 'type'> <class '__main__.Hello'>
ここでは、まず、クラス オブジェクトを作成する type() 関數(shù)のパス パラメーターの説明を理解する必要があります:
1. クラスの名前 (例の Hello など)
2.継承された親クラスのコレクション。Python は多重継承をサポートしていることに注意してください。親クラスが 1 つだけの場合、タプルは単一の要素を使用して作成する必要があります。この例では、オブジェクト クラスが継承されます。単一要素のタプルであるため、 (object,)
3 と記述されます。クラスのメソッド名が関數(shù)にバインドされています。この例では、関數(shù) printHello がメソッド名 hello
にバインドされています。具體的なパターンは次のとおりです。
type(クラス名、親クラスのタプル (継承の場合は空にすることもできます)、屬性 (名前と値) を含む辭書)
具體的なことを理解した後、パラメーターの使用法について、出力結(jié)果を見てみましょう。Python インタープリターはクラス定義に遭遇すると、その構(gòu)文をスキャンするだけなので、type() 関數(shù)を通じて作成されたクラスと直接書き込みクラスがまったく同じであることがわかります。クラス定義を作成し、type() 関數(shù)を呼び出してクラスを作成します。
しかし、一般に、クラスを定義するには class ***... メソッドを使用しますが、type() 関數(shù)を使用してクラスを作成することもできます。言い換えれば、動的言語自體は、実行時にクラスの動的な作成をサポートしていますが、靜的言語とは大きく異なります。靜的言語の実行時にクラスを作成するには、ソース コード文字列を構(gòu)築してからコンパイラを呼び出す必要があります。 、またはいくつかのツールを使用して単語を生成する セクションコードの実裝は基本的に動的コンパイルであり、非常に複雑になる可能性があります。
ご覧のとおり、Python ではクラスもオブジェクトであり、クラスを動的に作成できます。実際、これはキーワード class を使用するときに Python がバックグラウンドで行うことであり、これはメタクラスを通じて実現(xiàn)されます。