49 votes

Existe-t-il un moyen d'implémenter des méthodes telles que __len__ ou __eq__ en tant que méthodes de classe ?

Il est assez facile d'implémenter la __len__(self) en Python afin qu'elle gère les len(inst) comme celui-ci :

 class A(object):

  def __len__(self):
    return 7

a = A()
len(a) # gives us 7

Et il existe de nombreuses méthodes similaires que vous pouvez définir ( __eq__ , __str__ , __repr__ etc.). Je sais que les classes Python sont aussi des objets.

Ma question : puis-je définir, par exemple, __len__ pour que ce qui suit fonctionne :

 len(A) # makes sense and gives some predictable result

5voto

eryksun Points 10251

Puisqu'une classe est une instance d'une métaclasse, une façon consiste à utiliser une métaclasse personnalisée :

 >>> Meta = type('Meta', (type,), {'__repr__': lambda cls: 'class A'})
>>> A = Meta('A', (object,), {'__repr__': lambda self: 'instance of class A'})
>>> A
class A
>>> A()
instance of class A

-6voto

Ankhara33 Points 5

essaye ça:

 class Lengthy:
    x = 5
    @classmethod
    def __len__(cls):
        return cls.x

La @classmethod vous permet de l'appeler directement sur la classe, mais votre implémentation len ne pourra dépendre d'aucune variable d'instance :

 a = Lengthy()
len(a)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X