2016-07-13 4 views
0

Quelle est la manière pythonique de gérer les objets volumineux? Dans mon exemple, je pourrais avoir une grande classe créant une instance avec de nombreux attributs ou je pouvais regrouper certains d'entre eux ensemble (voir classe voiture et moteur de classe):Diviser un gros objet en sous-objets plus petits dans l'instance

class Car(object): 

    color = "red" 

    def __init__(self, num_wheels): 
     self.burst = Motor(self) 
     self.wheels = num_wheels 
     for i in range(self.wheels): 
      setattr(self, "wheel{}".format(i), Wheel(self, i)) 

    def _query(self, value): 
     print "Get Serial Data: {}".format(value) 


class Motor(object): # Object is loaded only once in Car instance 

    def __init__(self, top): 
     self._top = top 

    def temperature(self): 
     return self._top._query("GET MOTOR TEMP") 

    def rpm(self): 
     return self._top._query("GET MOTOR RPM") 


class Wheel(object): # Object could be loaded many times in Car instance 

    def __init__(self, top, number): 
     self._top = top 
     self._number = number 

    def temperature(self): 
     return self._top._query("GET WHEEL TEMP {}".format(self._number)) 

    def rpm(self): 
     return self._top._query("GET WHEEL RPM {}".format(self._number)) 

Je pense que cela est encore plus logique, lorsque la voiture a plus d'une roue, car je pourrais ajouter plus de roues.

Mais depuis moteur est jamais utilisé plus d'une fois et jamais utilisé ailleurs où, est-il mieux le style de les mettre dans la classe du véhicule:

class Car(object): 

    color = "red" 

    def __init__(self, num_wheels): 
     # Add wheels or other stuff 

    def _query(self, value): 
     print "Get Serial Data: {}".format(value) 


    def motor_temperature(self): 
     return self._query("GET MOTOR TEMP") 

    def motor_rpm(self): 
     return self.._query("GET MOTOR RPM") 

je vais devoir accéder Car._query() de la La classe de roue et/ou de moteur et mon objet réel de vie contient environ 40 attributs et méthodes que je pourrais regrouper dans 4-5 sous-instances. Impossible de trouver beaucoup sur ce sujet sur le web.

Répondre

0

Si vous utilisez un grand nombre d'instances, vous pouvez utiliser slots pour réduire l'empreinte mémoire.