class frage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

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 ?!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dann solltest du eben auch auf die Klassenvariable `index.t` zugreifen.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

so müsstest du per self.t darauf zugreifen oder per index.t, je nach dem.

Edit: warst schneller
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
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.
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

danke
Antworten