これは、Pythonを使用して同じデータのさまざまな形式からクラスまたはタイプのインスタンスを作成するためのベストプラクティスに関する質問です。クラスメソッドを使用する方が良いですか、それとも別の関数を一緒に使用する方が良いですか?ドキュメントのサイズを説明するために使用されるクラスがあるとしましょう。(注:これは単なる例です。ドキュメントのサイズを説明する最良の方法ではなく、クラスのインスタンスを作成するための最良の方法を知りたいです。)
class Size(object):
"""
Utility object used to describe the size of a document.
"""
BYTE = 8
KILO = 1024
def __init__(self, bits):
self._bits = bits
@property
def bits(self):
return float(self._bits)
@property
def bytes(self):
return self.bits / self.BYTE
@property
def kilobits(self):
return self.bits / self.KILO
@property
def kilobytes(self):
return self.bytes / self.KILO
@property
def megabits(self):
return self.kilobits / self.KILO
@property
def megabytes(self):
return self.kilobytes / self.KILO
私の__init__
メソッドはビットで表されたサイズ値を取ります(ビットとビットのみであり、それを維持したい)が、サイズ値がバイトであり、クラスのインスタンスを作成したいとします。クラスメソッドを使用する方が良いですか、それとも別の関数を一緒に使用する方が良いですか?
class Size(object):
"""
Utility object used to describe the size of a document.
"""
BYTE = 8
KILO = 1024
@classmethod
def from_bytes(cls, bytes):
bits = bytes * cls.BYTE
return cls(bits)
また
def create_instance_from_bytes(bytes):
bits = bytes * Size.BYTE
return Size(bits)
これは問題のようには思えないかもしれませんし、おそらく両方の例が有効ですが、私はこのようなものを実装する必要があるたびにそれについて考えます。クラスとファクトリメソッドを結び付けることの組織的な利点が好きなので、長い間、クラスメソッドアプローチを好みました。また、クラスメソッドを使用すると、サブクラスのインスタンスを作成する機能が保持されるため、オブジェクト指向になります。一方、友人が「疑わしいときは標準ライブラリと同じことをしてください」と言ったことがありますが、私はまだ標準ライブラリでその例を見つけていません。