[python] fonction=class(fonction)

Fermé
blackevil Messages postés 1 Date d'inscription mardi 22 juin 2004 Statut Membre Dernière intervention 13 avril 2007 - 13 avril 2007 à 17:07
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Non membre Dernière intervention 5 février 2025 - 13 avril 2007 à 18:36
Bonjour, je suis en master informatique et mon prof d'outils web nous a demander de faire un framework en python, le seul probleme, c'est qu'on a (pratiquement) jamais touché a python, donc j'aurais quelques question, si il vous manque des precisions hésiter pas
Le prof nous a donné un exemple sur la gestion des cookies.

def gateau(environ,start_response):
         try:
              n=int(environ['obiwan.cookie'].get('n').value)
        except:
              n=0 environ['obiwan.cookie.out']['n']=str(n+1)
         return render(start_response,'cook.html',{'n':n}) 

gateau=Cookies(gateau)

voila un exemple que l'utilisateur du framework fait lui meme pour la gestion des cookies. Voila la classe cookies:

from Cookie import SimpleCookie
import os
class Cookies(object):
	def __init__(self,app):
		self.app=app
	def __call__(self,environ,start_response):
		c=SimpleCookie()
		c.load(environ.get('HTTP_COOKIE',''))
		environ['obiwan.cookie']=c
		self.out=SimpleCookie()
		environ['obiwan.cookie.out']=self.out
		self.orig_start=start_response
		return self.app(environ,self.start_response)
	def start_response(self,s,headers):
		for i in self.out:
			headers.append(('Set-Cookie',self.out[i].OutputString()))
		return self.orig_start(s,headers)


Pour l'instant j'aimerai juste savoir que fait exactement gateau=Cookies(gateau) je pense qu'il appelle la fonction callable __call__mais je comprend pas comment on peu mettre une fonction en parametre(enfin si en c/java mais la je comprend pas) et surtout que veuc dire fonction=class(fonction)

Ps: Euu en python =>2.4 je croit que gateau=Cookies(gateau) peux etre mis grace un decorateur avant la fonction grace à @Cookies
Mais sa m'aide pas je voie toujours pas ce que sa veux dire
A voir également:

1 réponse

kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Non membre Dernière intervention 5 février 2025 1 526
13 avril 2007 à 18:36
Salut,

La methode __call__ permet de surcharger l'opérateur "()" (l'appel de fonction).

Donc si tu fais ça:
class Machin:
    def __call__(self, arg1):
        print arg1

obj = Machin()
obj("je suis un objet qui peut être appelé comme une fonction")

#Affiche je suis un objet....

Donc en faisant ça:
gateau=Cookies(gateau)


gateau devient un objet Cookies qui peut être appelé comme une fonction.
Mais self.app de l'objet gateau prend l'ancienne valeur de gateau (soit la première fonction gateau).

Du coup si tu regardes __call__, l'objet gateau va retourner self.app(environ,self.start_response), soit ce que la première fonction gateau aurait retourné, sachant que la variable environ a été modifiée dans __call__ (entre autres...)....
0

Discussions similaires