Questa è una domanda riguardante la procedura migliore per creare un'istanza di una classe o un tipo da forme diverse degli stessi dati utilizzando python. È meglio usare un metodo di classe o è meglio usare una funzione separata del tutto? Diciamo che ho una classe usata per descrivere la dimensione di un documento. (Nota: questo è semplicemente un esempio vorrei sapere il modo migliore per creare un'istanza della classe non il modo migliore per descrivere le dimensioni di un documento..)Metodo factory per oggetto python - 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
Il mio metodo __init__
assume un valore di dimensione rappresentato in bit (bit e solo bit e voglio mantenerlo in questo modo) ma diciamo che ho un valore di dimensione in byte e voglio creare un'istanza della mia classe. È meglio usare un metodo di classe o è meglio usare una funzione separata del tutto?
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)
O
def create_instance_from_bytes(bytes):
bits = bytes * Size.BYTE
return Size(bits)
Questo può non sembrare un problema e forse entrambi gli esempi sono validi, ma ci penso ogni volta che ho bisogno di implementare qualcosa di simile. Per molto tempo ho preferito l'approccio al metodo di classe perché mi piacciono i vantaggi organizzativi legati alla combinazione tra classe e metodo di produzione. Inoltre, l'uso di un metodo di classe preserva la possibilità di creare istanze di qualsiasi sottoclasse in modo che sia più orientato agli oggetti. D'altra parte, un amico una volta ha detto "In caso di dubbio, fa quello che fa la libreria standard" e io devo ancora trovare un esempio di questo nella libreria standard.
Qualsiasi feedback è molto apprezzato.
Acclamazioni
Vorrei lanciare una moneta. La maggior parte delle librerie python sembra preferire le API procedurali, ma è perché sono pensate per essere consumate in un modo diverso dal codice riutilizzabile interno alla base di codice. – millimoose
PS, non chiamare una variabile 'byte'; questo è un tipo predefinito (in 2.6 e versioni successive). – abarnert
E ovviamente mi sono appena accorto di aver commesso lo stesso errore nella mia risposta: 'Size (bytes = 20)'. Non fare come faccio io, faccio come dico io. :) – abarnert