To jest pytanie dotyczące najlepszej praktyki tworzenia instancji klasy lub typu z różnych form tych samych danych przy użyciu Pythona. Czy lepiej jest używać metody klasy lub czy lepiej jest używać osobnej funkcji? Powiedzmy, że mam klasę używaną do opisu rozmiaru dokumentu. (Uwaga: To jest po prostu przykładem Chcę wiedzieć, że najlepszym sposobem, aby utworzyć instancję klasy nie jest najlepszym sposobem na opisanie rozmiaru dokumentu..)Metoda fabryki dla obiektu Pythona - najlepsza praktyka
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
Moja __init__
metoda przyjmuje wartość rozmiarze reprezentowane w bitach (bitach i tylko bitach i chcę zachować to w ten sposób), ale powiedzmy, że mam wielkość w bajtach i chcę utworzyć instancję mojej klasy. Czy lepiej jest używać metody klasy lub czy lepiej jest używać osobnej funkcji?
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)
LUB
def create_instance_from_bytes(bytes):
bits = bytes * Size.BYTE
return Size(bits)
To może nie wydawać się problem, a może oba przykłady są ważne, ale myślę o tym za każdym razem, kiedy trzeba zaimplementować coś takiego. Od dłuższego czasu preferuję podejście oparte na metodzie klasowej, ponieważ podoba mi się korzyści organizacyjne związane z powiązaniem klasy i metody fabryki. Ponadto użycie metody klasy zachowuje możliwość tworzenia wystąpień dowolnych podklas, dzięki czemu jest bardziej zorientowana na obiekt. Z drugiej strony znajomy powiedział kiedyś: "Kiedy masz wątpliwości, rób to, co robi standardowa biblioteka", a jeszcze nie znalazłem tego przykładu w standardowej bibliotece.
Wszelkie uwagi są mile widziane.
Cheers
Rzuciłbym monetą. Większość bibliotek Pythona wydaje się preferować interfejsy API proceduralne, ale to dlatego, że są one przeznaczone do spożywania w inny sposób niż wielokrotnego użytku, który jest wewnątrz kodu. – millimoose
PS, nie wywołuj zmiennej 'bytes'; jest to typ wbudowany (w wersji 2.6 i późniejszych). – abarnert
I oczywiście właśnie zdałem sobie sprawę, że popełniłem ten sam błąd w mojej odpowiedzi: "Rozmiar (bajty = 20)". Nie rób tak jak ja, rób tak, jak mówię. :) – abarnert