Python クラス ファクトリ
- Python でクラス ファクトリを作成する方法
-
class
キーワードを使用して Python でクラス ファクトリを作成する -
type
キーワードを使用して Python でクラス ファクトリを作成する
クラスを作成してそれを返すことを目的とする単純な関数は、クラス ファクトリと呼ばれます。 強力なパターンの 1つであるクラス ファクトリは、Python で広く使用されています。
このチュートリアルでは、クラス ファクトリを作成するために使用できるさまざまな方法を示します。
Python でクラス ファクトリを作成する方法
クラス ファクトリを設計するには 2つの方法があります。 1つはコーディング時にクラスを作成し、もう 1つは実行時にクラスを作成します。
前者は class
キーワードを使用し、後者は type
キーワードを使用します。 これらの方法は両方とも、以下の記事で説明され、対比されています。
class
キーワードを使用して Python でクラス ファクトリを作成する
class
キーワードを使用してクラス ファクトリを作成できます。 このためには、関数を作成し、関数の定義内にクラスを保持する必要があります。
次のコードは、class
キーワードを使用して、Python でクラス ファクトリを作成します。
def ballfun():
class Ball(object):
def __init__(self, color):
self.color = color
def getColor(self):
return self.color
return Ball
Ball = ballfun()
ballObj = Ball("green")
print(ballObj.getColor())
上記のコードは、次の出力を提供します。
green
type
キーワードを使用して Python でクラス ファクトリを作成する
type
キーワードを使用すると、クラスを動的に作成できます。 Python でクラス ファクトリを作成するには、type
キーワードを使用する必要があります。
ただし、type
キーワードを使用すると、関数は名前空間のみに残り、クラスと一緒になることに注意してください。
次のコードは、type
キーワードを使用して、Python で動的クラスを作成します。
def init(self, color):
self.color = color
def getColor(self):
return self.color
Ball = type(
"Ball",
(object,),
{
"__init__": init,
"getColor": getColor,
},
)
ballGreen = Ball(color="green")
print(ballGreen.getColor())
上記のコードは、次の出力を提供します。
green
type
キーワードを使用すると、実行時に動的なクラスと効果的な作成が可能になりますが、欠点もあります。 上記のコードでわかるように、init
関数と getColor
関数の両方が名前空間に散らかっています。
さらに、動的クラスが type
キーワードを使用して作成されると、これらの関数の再利用の可能性も失われます。
これに対する簡単な解決策は、クラス ファクトリの導入です。 コード内の混乱を減らし、関数の再利用性を促進するため、両方の方法で役立ちます。
次のコードは、type
キーワードを使用して、Python でクラス ファクトリを作成します。
def create_ball_class():
def init(self, color):
self.color = color
def getColor(self):
return self.color
return type(
"Ball",
(object,),
{
"__init__": init,
"getColor": getColor,
},
)
Ball = create_ball_class()
ballObj = Ball("green")
print(ballObj.getColor())
上記のコードは、次の出力を提供します。
green
クラス ファクトリを作成する方法を見てきましたが、新しく学んだクラス ファクトリの概念を使用する場合と使用しない場合を区別することも重要です。
一般に、クラス ファクトリは、コーディング時にどの属性が割り当てられるかがわからない場合に役立ちます。
Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.
LinkedIn