Misalkan saya memiliki file yang foo.py
berisi kelas Foo
:
class Foo(object):
def __init__(self, data):
...
Sekarang saya ingin menambahkan fungsi yang membuat Foo
objek dengan cara tertentu dari data sumber mentah. Haruskah saya meletakkannya sebagai metode statis di Foo atau sebagai fungsi lain yang terpisah?
class Foo(object):
def __init__(self, data):
...
# option 1:
@staticmethod
def fromSourceData(sourceData):
return Foo(processData(sourceData))
# option 2:
def makeFoo(sourceData):
return Foo(processData(sourceData))
Saya tidak tahu apakah lebih penting untuk nyaman bagi pengguna:
foo1 = foo.makeFoo(sourceData)
atau apakah lebih penting untuk mempertahankan kopling yang jelas antara metode dan kelas:
foo1 = foo.Foo.fromSourceData(sourceData)
@classmethod
, lihat Arti @classmethod dan @staticmethod untuk pemula?Dengan Python, saya biasanya lebih suka hierarki kelas daripada metode pabrik. Sesuatu seperti:
Saya akan menempatkan seluruh hierarki (dan hanya yang ini) dalam sebuah modul, katakanlah
foos.py
. Kelas dasarFoo
biasanya mengimplementasikan semua metode (dan dengan demikian, antarmuka), dan biasanya tidak dibangun oleh pengguna secara langsung. Subclass adalah sarana untuk menimpa konstruktor dasar, dan menentukan bagaimanaFoo
harus dibangun. Lalu saya akan membuatFoo
dengan memanggil konstruktor yang sesuai, seperti:Saya merasa lebih elegan dan fleksibel daripada pabrik yang dibangun dari metode statis, metode kelas, atau fungsi tingkat modul.
sumber