CostumizatedClass - wo ist hier der bug

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
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

irgendwie finde ich hier den bug nicht - hier wird der armen CostumizatedClass die ganze zeit die attribute __members__ und __methods__
angefordert. irgendwie ist das programm in einer endloschleife geraten (keine rekursive, kriege keinen StackError)


danke

Code: Alles auswählen

from time import sleep

class CostumizatedClass(object):
    def __getattr__(self, attr):
        if not attr in dir(self): # dir liefert alle attribute einer classe/objekts
            raise AttributeError, "attribut " + attr + " nicht vorhanden"
        elif attr.startswith('printe_') and attr.endswith("_in_vier_sekunden"):
            def retval():
                sleep(4)
                print attr[7:-17]
            return retval
        elif attr == "top_secret":
            raise AttributeError, "you are not permited to acess this method"
        else:
            getattr(self, attr) # mit getattr kann man attribute eines objekts anhand eines strings fordern
    
    def top_secret(self):
        formatiere_hda1()
            
         

c = CostumizatedClass()
c.printe_hello_world_in_vier_sekunden()
c.top_secret
[/code]
cp != mv
BlackJack

Dein Englisch ist genau so gut wie Dein Deutsch. Das heisst `CostumizedClass`. :-)

Der Übeltäter ist die erste ``if``-Abfrage. Die ist aber sowieso überflüssig, weil `__getattr__()` nur aufgerufen wird, wenn das Attribut nicht existiert. Diesen Test hat Python also zu dem Zeitpunkt schon längst gemacht. Damit ist auch der letzte ``else``-Zweig überflüssig bzw. sogar gefährlich weil man damit eine Endlosrekursion erzeugt.

Und natürlich kannst Du mit einer Methode die nur aufgerufen wird, wenn es das Attribut nicht gibt, nicht verhindern, dass Attribute die vorhanden sind, abgefragt werden können.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BlackJack hat geschrieben:Das heisst `CostumizedClass`. :-)
Du, heißt das nicht "CostimizedClass"? :mrgreen:

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die iterative Annäherung an "CustomizedClass" möchte ich dann mal hiermit abschließen :D
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Leider weiß man auch mit dem richtiggeschriebenen Namen überhaupt nicht, was die Klasse eigentlich tut. :D
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

birkenfeld hat geschrieben:Leider weiß man auch mit dem richtiggeschriebenen Namen überhaupt nicht, was die Klasse eigentlich tut. :D
Du siehst das viel zu eng.
Es ist doch an der Zeit neue Wege zu gehen.
Zuerst etwas programmieren und dann eine Verwendung dafür finden.

In Zukunft wird man also nicht mehr fragen wie man etwas programmiert, sondern wofür man es verwendet.

Vielleicht sollte man schon über ein entsprechendes Forum nachdenken.

LG

rolgal_reloaded
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

naja, das ganze sollte nur ein beispiel fuer class cost... custo aehh casta - egal - sein

und keine real world problemloesung ( ;

mein denkfehler lag daran, dass ich dachte __getattr__ wuerde immer bei einer attribut abfrage aufgerufen werden, die passiert aber nur wenn die classe das gewuenschte attr nicht enthalet....


ps: wieso koennen nicht alle haendchen halten und freunde sein?
cp != mv
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Costi hat geschrieben:ich dachte __getattr__ wuerde immer bei einer attribut abfrage aufgerufen werden, die passiert aber nur wenn die classe das gewuenschte attr nicht enthalet....
Hallo Costi!

Suche in der Hilfe nach "__getattribute__". Das wird bei Newstyle-Klassen bei jedem Attributzugriff aufgerufen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten