2009-06-05 7 views
2

Wie finde ich heraus, in welcher Klasse ich einen Dekorator initialisiere? Es macht Sinn, dass ich das nicht herausfinden könnte, da der Dekorateur noch nicht an die Klasse gebunden ist, aber gibt es eine Möglichkeit, das zu umgehen?Wie kann während der Initialisierung in Python auf die Elternklasse zugegriffen werden?

class A(object): 
    def dec(f): 
       # I am in class 'A' 
     def func(cls): 
      f(cls) 
     return func 

    @dec 
    def test(self): 
     pass 

Ich muss wissen, welche Klasse ich bin (angezeigt durch die kommentierte Zeile).

+0

http://stackoverflow.com/questions/805066/how-to-call-a-parent-classs-method-from-child-class-in -python –

+0

Frage 805066 ist über super(), ich sehe nicht, wie das hier hilft. – balpha

+0

Es gibt keinen Weg darum, wie Ihr Beispiel steht. Aber wenn Sie mehr darüber erfahren, warum Sie auf die Klasse zugreifen müssen, können wir Ihnen helfen, bessere Wege zu finden. –

Antwort

3

Ich glaube nicht, dass das möglich ist. In dem Moment, in dem Sie test definieren, existiert die Klasse noch nicht.

Wenn Python trifft

class A(object): 

es erstellt einen neuen Namensraum, in dem sie alle Codes ausgeführt wird, die es in der Klassendefinition findet (einschließlich der Definition von Test() und den Anruf an den Dekorateur), und wenn Es ist fertig, es erstellt ein neues Klassenobjekt und fügt alles in diese Klasse ein, die nach Ausführung des Codes im Namespace verblieben ist.

Wenn also der Decorator aufgerufen wird, weiß er noch nichts. In diesem Moment ist der Test nur eine Funktion.

0

Ich bekomme die Frage nicht.

>>> class A(object): 
    def dec(f): 
     def func(cls): 
      print cls 
     return func 

    @dec 
    def test(self): 
     pass 

>>> a=A() 
>>> a.test() 
<__main__.A object at 0x00C56330> 
>>> 

Das Argument (cls) ist die Klasse, A.

+0

Er möchte * vor * die Definition von Func (aus welchem ​​Grund auch immer) wissen. – balpha

+0

Da man nicht zu wissen braucht, "bevor" die Klasse definiert ist, bekomme ich die Frage nicht. –

0

Wie Nadia darauf hingewiesen hat, müssen Sie genauer sein. Python erlaubt diese Art von Dingen nicht, was bedeutet, dass was Sie versuchen, ist wahrscheinlich etwas falsch.

In der Zwischenzeit ist hier mein Beitrag: eine kleine Geschichte über einen Seemann und einen Frosch. (Verwendung eines Konstruktors nach die Klasseninitialisierung)

class Cruise(object): 
    def arewelostyet(self): 
     print 'Young sailor: I think I am lost, help me :s' 

instance = Cruise() 

instance.arewelostyet() 

def whereami(lostfunc): 
    """ 
    decorator 
    """ 
    def decorated(*args, **kwargs): 
     lostfunc(*args, **kwargs) 
     print 'Frog: Crôak! thou art sailing in class', lostfunc.im_class.__name__ 

    # don't forget to write name and doc 
    decorated.func_name = lostfunc.func_name 
    decorated.func_doc = lostfunc.func_name 

    return decorated 


print '[i]A frog pops out of nowhere[/i]' 

# decorate the method: 
Cruise.arewelostyet = whereami(Cruise.arewelostyet) 

instance.arewelostyet() 
Verwandte Themen