J'ai une classe de conteneur qui contient des données. Lorsque le conteneur est créé, il existe différentes méthodes pour transmettre des données.
- Passer un fichier qui contient les données
- Transmettre les données directement via des arguments
- Ne pas transmettre les données; il suffit de créer un conteneur vide
En Java, je voudrais créer trois constructeurs. Voici à quoi il ressemblerait s'il était possible en Python:
class Container:
def __init__(self):
self.timestamp = 0
self.data = []
self.metadata = {}
def __init__(self, file):
f = file.open()
self.timestamp = f.get_timestamp()
self.data = f.get_data()
self.metadata = f.get_metadata()
def __init__(self, timestamp, data, metadata):
self.timestamp = timestamp
self.data = data
self.metadata = metadata
En Python, je vois trois solutions évidentes, mais aucun d'eux n'est assez:
Un: à l'Aide de mots clés arguments:
def __init__(self, **kwargs):
if 'file' in kwargs:
...
elif 'timestamp' in kwargs and 'data' in kwargs and 'metadata' in kwargs:
...
else:
... create empty container
B: à l'Aide d'arguments par défaut:
def __init__(self, file=None, timestamp=None, data=None, metadata=None):
if file:
...
elif timestamp and data and metadata:
...
else:
... create empty container
C: Seulement de fournir le constructeur pour créer des conteneurs vides. Fournir des méthodes pour remplir des récipients avec des données provenant de différentes sources.
def __init__(self):
self.timestamp = 0
self.data = []
self.metadata = {}
def add_data_from_file(file):
...
def add_data(timestamp, data, metadata):
...
Les Solutions A et B sont fondamentalement les mêmes. Je n'aime pas faire de la si/d'autre, surtout depuis que je dois vérifier si tous les arguments nécessaires pour cette méthode ont été fournis. Un est un peu plus souple que B si le code n'est jamais à être prolongée par une quatrième méthode pour ajouter des données.
La Solution C semble être le plus beau, mais l'utilisateur doit connaître la méthode qu'il exige. Par exemple: il ne peux pas faire de c = Container(args)
si il ne sait pas ce qu' args
est.
Quel est le plus Pythonic solution?