Seite 1 von 1

CostumizatedClass - wo ist hier der bug

Verfasst: Samstag 2. Juni 2007, 12:14
von Costi
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]

Verfasst: Samstag 2. Juni 2007, 13:25
von 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.

Verfasst: Samstag 2. Juni 2007, 14:49
von gerold
BlackJack hat geschrieben:Das heisst `CostumizedClass`. :-)
Du, heißt das nicht "CostimizedClass"? :mrgreen:

lg
Gerold
:-)

Verfasst: Samstag 2. Juni 2007, 16:05
von EyDu
Die iterative Annäherung an "CustomizedClass" möchte ich dann mal hiermit abschließen :D

Verfasst: Samstag 2. Juni 2007, 18:17
von birkenfeld
Leider weiß man auch mit dem richtiggeschriebenen Namen überhaupt nicht, was die Klasse eigentlich tut. :D

Verfasst: Samstag 2. Juni 2007, 20:01
von rolgal_reloaded
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

Verfasst: Samstag 2. Juni 2007, 23:06
von Costi
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?

Verfasst: Samstag 2. Juni 2007, 23:43
von gerold
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
:-)