classe et fonction en python

Fonction

def uneFonction ( unEntier, uneChaine):
    "documentation de la fonction"
    print "unEntier : " +  str( unEntier )

Fonction avec arguments dynamique

un exemple simple qui permet suivant le nombre d’argument d’appeler la fonction A ou B

def get( *args):
    if len(args) == 2:
        return _get(*args)
    if len(args) == 3:
        return _getdefault(*args)
    raise AttributeError, 'takes 3 or 4 arguments'

def _getdefault(section, option, default):
    if self.config.has_key(section) == False:
        return default
    if self.config[section].has_key(option) == False:
        return default
    return self.config[section][option]

def _get(section, option):
    if self.config.has_key(section) == False:
        raise NoSectionError(section)
    if self.config[section].has_key(option) == False:
        raise NoOptionError(section, option)
    return self.config[section][option]

Class simple

class Fruit :
    "documentation de la classe"

    def __init__(self) :
        self._a = 0 # variable privée
        self.b = 1 #variable public
        pass

    def __str__(self):
        return "ceci est un fruit"

    def _fonctionPrive(self):
        "documentation de la fonction"
        pass

    def fonctionPublic(self):
        "documentation de la fonction"
        pass


if __name__ == "__main__":
    a = Fruit()
    print a

on peut obtenir alors de nombreuse information

a = Fruit()
print a.__dict__
>>{'b': 1, '_a': 0}
print a.__doc__
>>documentation de la classe
print a.__class__
>><class __main__.Fruit at 0x01E5FA50>
print a.__class__.__dict__.keys()
>>['__module__', '_fonctionPrive', 'fonctionPublic', '__str__', '__doc__', '__init__']
print a.__class__.__name__
>>Fruit

Heritage

class Fruit :
    def __init__(self) :
        pass

class Pomme(Fruit):
    """
    Cette classe represente une pomme.
    """
    Mangeurs = ["Jacques", "Nicolas","Virgile"]

    def __init__(self, couleur):
        """
        Pour construire une Pomme, donnez sa couleur.
        """
        Fruit.__init__(self)
        self._couleur = couleur

    def couleur(self):
        """
        Retourne la couleur de la Pomme.
        """
        return self._couleur

    def comestible(self, mangeur):
        """
        Dit si la pomme est comestible ou non,
        en fonction du mangeur.
        """
        if mangeur in self.Mangeurs:
            print mangeur, "mange des pommes"
        else:
            print mangeur, "n'aime pas les pommes"

petitePomme = Pomme("verte")
petitePomme.comestible("Pierre")      # Pierre n'aime pas les pommes
petitePomme.comestible("Nicolas")     # Nicolas mange des pommes

liste des méthodes héritées:

__init__
__del__ : suppression
__str__ : print
__getattr__
__setattr__
__delattr__
__add__
__sub__
__mul__
__mod__
__div__
__divmod__
__comp__
__pow__
__lshift__
__rshit__
__and__
__or__
__xor__
__doc__

pour les collections

__len__
__getitem__
__setitem__
__delitem__
__getslice__
__setslice__

un petit exemple d’utilisation

class foo:
    a = 0
    def __getattr__(self, name):
        return "%s: DEFAULT" % name
i = foo()
i.b = 1
print i.a # return 0
print i.b # return 1
print i.c # return c: DEFAULT

Utilisation des méthode interne

class C(object):

    def __init__(self):
        self.x = 0
        self.y = 0

    def __setattr__(self, name, value):
        """Ne modifie pas x si la valeur est négative"""
        if name == 'x' and value < 0:
            return
        # Pour tout autre attribut on affecte la valeur
        object.__setattr__(self, name, value)

Utilisation de l’exemple :

>>> o = C()
>>> o.x, o.y
    (0, 0)
>>> o.x = 7
>>> o.x, o.y
    (7, 0)
>>> o.y = -1
>>> o.x, o.y
    (7, -1)
>>> o.x = -5
>>> o.x, o.y
    (7, -1)

Surcharge des accès aux attributs

La méthode spéciale __getattr__ permet de définir une méthode d’accès à nos attributs plus large que celle que Python propose par défaut. En fait, cette méthode est appelée quand vous tapez objet.attribut (non pas pour modifier l’attribut mais simplement pour y accéder). Python recherche l’attribut et, s’il ne le trouve pas dans l’objet et si une méthode __getattr__ existe, il va l’appeler en lui passant en paramètre le nom de l’attribut recherché, sous la forme d’une chaîne de caractères.

>>> class Protege:
...     """Classe possédant une méthode particulière d'accès à ses attributs :
...     Si l'attribut n'est pas trouvé, on affiche une alerte et renvoie None"""
...
...
...     def __init__(self):
...         """On crée quelques attributs par défaut"""
...         self.a = 1
...         self.b = 2
...         self.c = 3
...     def __getattr__(self, nom):
...         """Si Python ne trouve pas l'attribut nommé nom, il appelle
...         cette méthode. On affiche une alerte"""
...
...
...         print("Alerte ! Il n'y a pas d'attribut {} ici !".format(nom))
...
>>> pro = Protege()
>>> pro.a
1
>>> pro.c
3
>>> pro.e
Alerte ! Il n'y a pas d'attribut e ici !
>>>

surcharge modification d’un attribut

Cette méthode définit l’accès à un attribut destiné à être modifié. Si vous écrivez objet.nom_attribut = nouvelle_valeur, la méthode spéciale __setattr__ sera appelée ainsi : objet.__setattr__(“nom_attribut”, nouvelle_valeur). Là encore, le nom de l’attribut recherché est passé sous la forme d’une chaîne de caractères. Cette méthode permet de déclencher une action dès qu’un attribut est modifié, par exemple enregistrer l’objet :

def __setattr__(self, nom_attr, val_attr):
        """Méthode appelée quand on fait objet.nom_attr = val_attr.
        On se charge d'enregistrer l'objet"""


        object.__setattr__(self, nom_attr, val_attr)
        self.enregistrer()

gestion des attributs avec decorator

Pour gérer des propriétés de classe

class Mamouth(object):

    _valeur = "3 calots"

    @property
    def valeur(self):
        return self._valeur.upper()

    @valeur.setter
    def valeur(self, valeur):
        self._valeur = valeur.strip()

>>> bille = Mamouth()
>>> bille.valeur
u'3 CALOTS'
>>> bille.valeur = "une pépite           "
>>> bille.valeur
>>> print(bille.valeur)
UNE PÉPITE

Gestion des docs

class A:
    """ la classe la plus simple """
    pass

a=A()
a.__doc__ # return 'la classe la plus simple '