À l'aide de méthodes statiques en python - meilleures pratiques

Quand et comment sont les méthodes statiques suppose être utilisé en python? Nous avons déjà établi à l'aide d'une méthode de classe dans l'usine de la méthode pour créer une instance d'un objet doit être évitée lorsque cela est possible. En d'autres termes, il n'est pas recommandé d'utiliser les méthodes de la classe comme un autre constructeur (Voir Usine méthode pour objet python - meilleures pratiques).

Permet de dire que j'ai une classe utilisée pour représenter une entité de données dans une base de données. Imaginez les données est un dict objet contenant les noms des champs et des valeurs et de l'un des champs est un numéro d'identification qui rend les données unique.

class Entity(object):
    def __init__(self, data, db_connection):
        self._data = data
        self._db_connection

Ici mon __init__ méthode prend les données de l'entité dict objet. Disons que je n'ai qu'un numéro d'identification et je veux créer un Entity instance. Je vais d'abord vous devez trouver le reste des données, puis créer une instance de ma Entity objet. À partir de ma question précédente, nous avons établi que l'utilisation d'une méthode de la classe comme une méthode de fabrique doit probablement être évitée lorsque cela est possible.

class Entity(object):

    @classmethod
    def from_id(cls, id_number, db_connection):
        filters = [['id', 'is', id_number]]
        data = db_connection.find(filters)
        return cls(data, db_connection)

    def __init__(self, data, db_connection):
        self._data = data
        self._db_connection


# Create entity
entity = Entity.from_id(id_number, db_connection)

Ci-dessus est un exemple de ce que ne pas le faire ou au moins à ne pas faire si il y a une alternative. Maintenant je me demande si la modification de ma méthode de classe de sorte qu'il est plus d'une méthode utilitaire, et à moins d'une usine méthode est une solution valable. En d'autres termes, l'exemple suivant se conformer aux meilleures pratiques pour l'utilisation de méthodes statiques.

class Entity(object):

    @staticmethod
    def data_from_id(id_number, db_connection):
        filters = [['id', 'is', id_number]]
        data = db_connection.find(filters)
        return data


# Create entity
data = Entity.data_from_id(id_number, db_connection)
entity = Entity(data)

Ou est-il plus logique d'utiliser une fonction autonome de trouver les données de l'entité à partir d'un numéro d'identification.

def find_data_from_id(id_number, db_connection):
    filters = [['id', 'is', id_number]]
    data = db_connection.find(filters)
    return data


# Create entity.
data = find_data_from_id(id_number, db_connection)
entity = Entity(data, db_connection)

Remarque: je ne veux pas changer mon __init__ méthode. Auparavant, les gens ont suggéré de faire mon __init__ méthode à ressembler à quelque chose comme ceci __init__(self, data=None, id_number=None) mais il pourrait y avoir des 101 différentes façons de trouver de l'entité de données, donc je préfère garder cette logique de séparer, dans une certaine mesure. Un sens?

Le nom de cette question et la phrase introductive faire sonner comme vous êtes à creuser pour des raisons d'utiliser les fonctionnalités de langage, au lieu d'essayer de comprendre la bonne façon d'écrire le code que vous voulez. Je ne dis pas que ce que vous (le corps de votre question est certainement une vraie, bonne question). C'est juste que vous devriez peut-être penser un peu au sujet de votre phrasé. De cette façon, vous pouvez seulement obtenir des réponses de personnes qui aiment débattre des fonctionnalités de langage, au lieu du plus grand bassin de personnes qui écrivent bien Python.

OriginalL'auteur Yani | 2013-02-22