これは、Pythonを使用して同じデータの異なるフォームからクラスまたは型のインスタンスを作成するためのベストプラクティスに関する質問です。クラスメソッドを使用するほうが良いですか、別の関数を使用する方が良いでしょうか?ドキュメントのサイズを記述するためのクラスがあるとします。 (注意:これは単に例であり、私はクラスではない文書のサイズを記述するための最良の方法のインスタンスを作成するための最良の方法をお知りになりたい)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)
OR
def create_instance_from_bytes(bytes):
bits = bytes * Size.BYTE
return Size(bits)
これが問題のように見えるかもしれないと、おそらく両方の例は有効ですが、私はそれについて、私はこのような何かを実装する必要があるたびに思います。私は、クラスメソッドとファクトリメソッドを一緒に結びつけるという組織的な利点が好きなので、長い間、クラスメソッドのアプローチを好んでいました。また、クラスメソッドを使用すると、任意のサブクラスのインスタンスを作成できるため、よりオブジェクト指向になります。一方、ある友人は、「疑わしいときは標準ライブラリが何をするのか」と言いましたが、私はまだ標準ライブラリでこれの例を見つけていません。
フィードバックは非常に高く評価されています。
乾杯
私はコインをひっくり返します。ほとんどのPythonライブラリは手続き型APIを好むようですが、それはコードベースの内部にある再利用可能なコードとは別の方法で消費されるためです。 – millimoose
PS、変数 'bytes'を呼び出さないでください。これは組み込み型(2.6以降)です。 – abarnert
もちろん、私は私の答えで同じミスを犯したことに気づいた。サイズ(バイト= 20)。私のようにしないでください、私が言うように。 :) – abarnert