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