NB Noob alert ...! J'essaie d'utiliser la récursivité dans une méthode de classe Python, mais avec des résultats limités. J'essaie de construire une classe de voiture, avec des attributs très basiques: id, position dans une route à une voie (représentée par un nombre entier), et vitesse. L'une des fonctions que j'ai utilisé pour retourner l'ID voiture se trouve en face de celui-ci - à savoir si nous avons la classe:Utilisation de la récursivité dans les méthodes de classe Python
class Car:
def __init__(self, position, id, velocity):
self.position = position
self.id = id
self.velocity = velocity
Maintenant, je suis venu avec la méthode de classe suivante (plus de détails ci-dessous le code):
def findSuccessorCar(self, cars):
successorCar = ""
smallestGapFound = 20000000
for car in cars:
if car.id == self.id: continue
currentGap = self.calculateGap(car)
if (currentGap > -1) and (currentGap < smallestGapFound):
smallestGapFound = currentGap
successorCar = car
if successorCar == "":
return 1 # calling code checks for 1 as an error code
else:
return successorCar
Le plan est de créer des objets de voiture, puis les stocker dans une liste. Chaque fois que la méthode findSuccessorMethod est appelée, cette liste globale de voitures lui est transmise, par ex.
c1 = testCar.Car(4, 5, 1) # position, pos_y, Vel, ID
c2 = testCar.Car(7, 9, 2)
c3 = testCar.Car(9, 1, 2)
cars = [c1, c2, c3]
c1_succ = c1.findSuccessorCar(cars)
Cela fonctionne très bien: la fonction de voiture successeur FIND dire que c2 voiture est en face de voiture c1 (position 7 avant la position 4).
Cependant, je veux que la voiture c1 détermine quelle voiture se trouve devant son successeur immédiat - c'est-à-dire quelle voiture se trouve devant la voiture en avant, qui est dans ce cas la voiture c3. Ma pensée était que si je faisais c1_succ.findSuccessorCars (voitures) alors cela devrait fonctionner correctement: faire type (c1_succ) montre qu'il s'agit d'une instance et hasattr montre qu'il a les attributs d'objets anticipés.
Cependant, lorsque j'essaie d'exécuter c1_succ.findSuccessorCars (cars), un entier est renvoyé. Par conséquent, je suis confus - pourquoi cela ne fonctionne pas? Pourquoi ne pouvez-vous pas récursivement exécuter une méthode de classe de cette façon? D'où vient cet entier? NB Gut feel dit que cela a quelque chose à voir avec l'auto-déclaration, et que je vais devoir modifier mon code pour qu'une liste globale de voitures, ainsi qu'une liste globale de leurs positions actuelles, ou une autre méthode de classe, p.ex. findSuccessorsSuccessor (oui, tout à fait conscient de la dénomination crummy!). Cependant, je suis intéressé de comprendre pourquoi cette approche récursive ne fonctionne pas.
MISE À JOUR
Voici le code demandé pour calculer un écart entre les 2 voitures - je l'apprécie est très basique, donc pas trop rire à l'arrière s'il vous plaît.
def calculateGap(self, car):
''' Calculate the gap between two cars
'''
thisCar = self
otherCar = car
gap = otherCar.position_x - thisCar.position_x
return gap
Pouvez-vous poster le code pour 'calculateGap'? Ensuite, il devrait être possible de reproduire ce que vous voyez. – mikej
@The MYYN, ce n'est pas une bonne idée; 'sys.maxint + 1' est un entier valide. 'None' fait une meilleure sentinelle. – habnabit