Édition: Ah, je vois. Vous demandez pourquoi quelqu'un ferait exactement le code ci-dessus. En fait, ce n'est pas une question de savoir pourquoi faire un lambda ou une propriété, ce n'est pas une question de différences entre les deux exemples, et même pas pourquoi vous voulez faire une propriété sur un lambda.
Votre question est "Pourquoi quelqu'un ferait-il une propriété d'un lambda qui retourne simplement self.__sub__
".
Et la réponse est: On ne le ferait pas.
Supposons que quelqu'un veut faire:
>>> foo = MyInt(8)
>>> print foo.difference(7)
1
Alors, il tente de l'accomplir par cette classe:
class MyInt(int):
def difference(self, i):
return self - i
Mais c'est deux lignes, et comme il est un programmeur Ruby et croit ce bon code est le code qui a quelques lignes de code, il le change en:
class MyInt(int):
difference = int.__sub__
Pour économiser un l ine de code. Mais apparemment, les choses sont encore trop faciles. Il a appris à Ruby qu'un problème est résolu pas correctement à moins que vous utilisez des blocs de code anonymes, donc il va essayer d'utiliser Pythons équivalent le plus proche, lambdas, sans aucune raison:
class MyInt(int):
difference=lambda self, i: self - i
Toutes ces œuvres. Mais les choses sont encore du chemin à simple, donc au lieu qu'il décide de rendre les choses plus complexes, en ne faisant pas le calcul, mais le retour de la méthode sous:
class MyInt(int):
difference=lambda self: self.__sub__
Ah, mais cela ne fonctionne pas, parce qu'il a besoin de appeler la différence pour obtenir la sous-méthode:
>>> foo = MyInt(8)
>>> print foo.difference()(7)
1
il a donc fait une propriété:
class MyInt(int):
difference=property(lambda self: self.__sub__)
il. Maintenant, il a trouvé la complexité maximale pour résoudre un non-problème.
Mais les gens normaux ne faire aucune de ces derniers, mais ne:
>>> foo = 8
>>> print foo - 7
1
OK, j'ai mis à jour ma réponse. –