Seite 1 von 1

class frage

Verfasst: Dienstag 19. Oktober 2010, 08:40
von Sync32
Irgendwie funktioniert meine Klasse nicht ganz.
Hier mein Testcode:

Der funktioniert:

Code: Alles auswählen

def get_template(htmlfile, **content_para):
    #Jinja2
    env = Environment(loader=FileSystemLoader('templates')) #template path
    tmpl = env.get_template(htmlfile)
    tmpl_result = tmpl.render(**content_para)
    return tmpl_result
    

class index(object):
    #t = MyTemplate()
    
    def index(self):
        x = time.ctime()       
        return get_template('test.html', name='Gast', current_date=x)
    index.exposed = True
    

    def byForm(self, username=None, password=None):
        if (username or password):
            return get_template('login.html', name=username, pw=password)
        else:
            return get_template('login.html', name='nicht angegeben', pw='nicht angegeben')            
    byForm.exposed = True

cherrypy.quickstart(index(), '/', 'cherrypy.conf')
Nun wollte ich die Funktion als Klasse haben, was nicht funktioniert:

Code: Alles auswählen

class MyTemplate(object):
    def __init__(self):
        print "Konstruktor"
    def __del__(self):
        print "Destruktor"
        
    def get_template(self, htmlfile, **content_para):
        #Jinja2
        env = Environment(loader=FileSystemLoader('templates')) #template path
        tmpl = env.get_template(htmlfile)
        tmpl_result = tmpl.render(**content_para)
        return tmpl_result
    

class index(object):
    t = MyTemplate()
    
    def index(self):
        x = time.ctime()       
        return t.get_template('test.html', name='Gast', current_date=x)
    index.exposed = True
    

    def byForm(self, username=None, password=None):
        if (username or password):
            return t.get_template('login.html', name=username, pw=password)
        else:
            return t.get_template('login.html', name='nicht angegeben', pw='nicht angegeben')            
    byForm.exposed = True

cherrypy.quickstart(index(), '/', 'cherrypy.conf')
Kommt der NameError
NameError: global name 't' is not defined

Habs doch in der index-klasse definiert ?!

Re: class frage

Verfasst: Dienstag 19. Oktober 2010, 08:49
von cofi
Dann solltest du eben auch auf die Klassenvariable `index.t` zugreifen.

Re: class frage

Verfasst: Dienstag 19. Oktober 2010, 08:50
von Xynon1
so müsstest du per self.t darauf zugreifen oder per index.t, je nach dem.

Edit: warst schneller

Re: class frage

Verfasst: Dienstag 19. Oktober 2010, 08:53
von BlackJack
@Sync32: Richtig Du hast es in der `index`-Klasse definiert und nicht (modul)global. Dementsprechend müsstest Du über `index.t` darauf zugreifen.

Allerdings habe ich das Gefühl Du missbrauchst hier Klassen als einfachen Namensraum für Funktionen. Klassen sind dazu da um Daten und Funktionen die auf diesen Daten operieren zu Objekten zusammen zu fassen. Wenn man also eine "Klasse" hat, bei der keine der "Methoden" das `self`-Argument benötigt, dann macht man IMHO etwas ganz grundlegend falsch.

Und `__del__()` ist weder ein Destruktor, noch sollte man diese Methode definieren. Lies Dir die Warnungen/Bemerkungen in der Dokumentation dazu mal durch. Alleine das Vorhandensein der Methode kann Probleme mit der Speicherverwaltung verursachen.

Re: class frage

Verfasst: Dienstag 19. Oktober 2010, 08:55
von Sync32
danke