mercredi 23 septembre 2009

Class information et héritage en Pyhton

Définir une class en Python est relativement simple.
Créer un objet a partir d'une classe est tout aussi simple.

>>> class myClass:
    def printHello(self):
        print('Hello world')
>>> myObj = myClass()
>>> myObj.printHello()
Hello world

Par contre, lorsque l'on dispose d'une référence sur un objet, l'utilisation de la fonction type(monObjet) indique que l'objet est une instance d'une classe... mais n'indique pas laquelle!
La fonction dir(monObjet) énumère les attribus de l'élément passé en paramètre. Encore une fois, cela n'indique pas quelle est la classe.
La fonction help(monObjet) fournit la liste des méthodes et bien entendu la classe mais son utilisation est principalement cantonné au mode interactif.

Pour extraire le nom de la classe (et d'autres informations) avec du code, l'on utilise alors les class-types.
Ainsi, l'utilisation de monObjet.__class__.__name__ fournira le résultat attendu.

>>> class Car:
    def WhoAmI( self ):
        print( 'my information are %s ' % (dir(self)) )
        print( 'my Type is %s ' % (type(self)) )
        print( 'my Class is %s ' % (self.__class__) )
        print( 'my Module is %s ' % (self.__class__.__module__) )
        print( 'my ClassName is %s ' % (self.__class__.__name__ ) )
>>> myCar = Car()
>>> myCar.WhoAmI()
my information are ['WhoAmI', '__doc__', '__module__'] 
my Type is <type instance>
my Class is __main__.Car 
my Module is __main__ 
my ClassName is Car 

Juste pour le plaisir de l'excercice académique, Python permet de recrée très facilement une autre instance d'une classe à partir d'une référence vers objet de cette dite classe.
>>> class Car:
    carInfo = 'This is a car'
    def printCarInfo( self ):
        print( 'carInfo = %s' % (self.carInfo))
    def WhoAmI( self ):
        print( 'my information are %s ' % (dir(self)) )
        print( 'my Type is %s ' % (type(self)) )
        print( 'my Class is %s ' % (self.__class__) )
        print( 'my Module is %s ' % (self.__class__.__module__) )
        print( 'my ClassName is %s ' % (self.__class__.__name__ ) )
>>> myCar = Car()
>>> # Utiliser une reference d objet pour recréer un autre objet de la même classe
>>> # ... juste pour le plaisir de le faire
>>> myCar2 = myCar.__class__()
>>> myCar2.carInfo = 'Anohter instance of Car object'
>>> myCar2.printCarInfo()
carInfo = Anohter instance of Car object
>>> myCar.printCarInfo()
carInfo = This is a car
>>> myCar2.WhoAmI()
my information are ['WhoAmI', '__doc__', '__module__', 'carInfo', 'printCarInfo'] 
my Type is <type instance> 
my Class is __main__.Car 
my Module is __main__ 
my ClassName is Car 

Voici quelques lignes de codes permettant de jouer un peu avec l'héritage en Python.
Pour rappel, Pyhton supporte l'héritage multiple (même si son utilisation n'est pas recommandée).
>>> class TurboCar(Car):
    carInfo = 'This is a *** TURBO *** car'
    def WhoAmI( self ):
        Car.WhoAmI(self) # call ancestor
        print( 'my bases classes are %s' % (self.__class__.__bases__) )     
>>> myTurbo = TurboCar()
>>> myTurbo.printCarInfo()
carInfo = This is a *** TURBO *** car
>>> myTurbo.WhoAmI()
my information are ['WhoAmI', '__doc__', '__module__', 'carInfo', 'printCarInfo'] 
my Type is <type instance> 
my Class is __main__.TurboCar 
my Module is __main__ 
my ClassName is TurboCar 
my bases classes are __main__.Car 


Source: Class-type article on (An Unofficial) Python Reference Wiki

Aucun commentaire: