Dies ist eine Frage in Bezug auf die Best Practice zum Erstellen einer Instanz einer Klasse oder eines Typs aus verschiedenen Formen der gleichen Daten mit Python. Ist es besser, eine Klassenmethode zu verwenden, oder ist es besser, eine separate Funktion zu verwenden? Sagen wir, ich habe eine Klasse verwendet, um die Größe eines Dokuments zu beschreiben. (Hinweis: Dies ist nur ein Beispiel, das ich den besten Weg, wissen will, eine Instanz der Klasse zu erstellen, nicht den besten Weg, um die Größe eines Dokument zu beschreiben..)Factory-Methode für Python-Objekt - Best Practice
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
Meine __init__
Methode nimmt einen Größenwert dargestellt in Bits (Bits und nur Bits und ich möchte es so behalten) aber lassen Sie uns sagen, ich habe einen Größenwert in Bytes und ich möchte eine Instanz meiner Klasse erstellen. Ist es besser, eine Klassenmethode zu verwenden, oder ist es besser, eine separate Funktion zu verwenden?
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)
ODER
def create_instance_from_bytes(bytes):
bits = bytes * Size.BYTE
return Size(bits)
Dies kann nicht wie ein Problem scheinen und vielleicht beiden Beispiele sind gültig, aber ich denke darüber jedes Mal, wenn ich etwas implementieren muß. Seit langem bevorzuge ich den Ansatz der Klassenmethode, weil ich die organisatorischen Vorteile der Verknüpfung der Klasse und der Fabrikmethode mag. Außerdem wird durch die Verwendung einer Klassenmethode die Möglichkeit zum Erstellen von Instanzen aller Unterklassen beibehalten, sodass sie objektorientierter ist. Auf der anderen Seite hat ein Freund einmal gesagt: "Im Zweifelsfall mach, was die Standardbibliothek tut", und ich finde noch ein Beispiel dafür in der Standardbibliothek.
Jede Rückmeldung wird sehr geschätzt.
Prost
Ich würde eine Münze werfen. Die meisten Python-Bibliotheken scheinen prozedurale APIs zu bevorzugen, aber das liegt daran, dass sie auf andere Weise als wiederverwendbarer Code konsumiert werden sollen, der in Ihrer Codebasis intern ist. – millimoose
PS, nenne keine Variable 'bytes'; das ist ein eingebauter Typ (in 2.6 und später). – abarnert
Und natürlich habe ich gerade gemerkt, dass ich in meiner Antwort den gleichen Fehler gemacht habe: 'Größe (Bytes = 20)'. Tun Sie nicht wie ich, tun Sie, was ich sage. :) – abarnert