2017-04-16 1 views
1

J'écris une fonction dans une classe en python, et les gens m'ont suggéré d'ajouter à cette fonction un décorateur @classmethod.Pourquoi devrais-je utiliser un classmethod en python?

Mon code:

import random 


class Randomize: 
    RANDOM_CHOICE = 'abcdefg' 

    def __init__(self, chars_num): 
     self.chars_num = chars_num 

    def _randomize(self, random_chars=3): 
     return ''.join(random.choice(self.RANDOM_CHOICE) 
         for _ in range(random_chars)) 

La modification proposée:

@classmethod 
    def _randomize(cls, random_chars=3): 
     return ''.join(random.choice(cls.RANDOM_CHOICE) 
         for _ in range(random_chars)) 

J'utilise presque toujours que la fonction _randomize.

Ma question est: Quels sont les avantages d'ajouter à une fonction le décorateur classmethod?

+5

Il est plus clair que la méthode n'utilise aucun état de l'instance, généralement appelé 'self'. Cela signifie également que vous pouvez le tester sur la classe sans créer d'instance. – jonrsharpe

+0

Aussi, si cette classe ne contient pas beaucoup d'autres, il est probablement préférable d'utiliser une fonction et 'functools.partial()'. Peut être. –

Répondre

2

Si vous voyez la méthode _randomize, vous n'utilisez aucune variable d'instance (déclarée dans init) mais elle utilise une classe var, c'est-à-dire RANDOM_CHOICE = 'abcdefg'. Cela signifie que votre méthode peut exister sans être une méthode d'instance et que vous pouvez l'appeler directement en classe.

Randomize._randomize() 

Maintenant, la question vient-elle avoir des avantages?

  • Je pense que oui, vous n'avez pas besoin de créer une instance pour utiliser cette méthode qui aura une surcharge.

    ran = Randomize() // Extra steps 
    ran._randomize() 
    

Vous pouvez en savoir plus sur la classe et variable d'instance here.