2013-10-14 7 views
9

Ich habe einige Code, wie dies für Django-Tastypie:Zugriff auf die Meta-Attribute einer Superklasse in Python?

class SpecializedResource(ModelResource): 
    class Meta: 
     authentication = MyCustomAuthentication() 

class TestResource(SpecializedResource): 
    class Meta: 
     # the following style works: 
     authentication = SpecializedResource.authentication 
     # but the following style does not: 
     super(TestResource, meta).authentication 

Ich möchte wissen, was die richtige Methode für den Zugriff auf Meta-Attribute der Oberklasse ohne Hartcodierung den Namen der übergeordneten Klasse sein würde.

+0

In dem von Ihnen bereitgestellten Snippet ist der Name einer Oberklasse nicht fest codiert - 'super()' nimmt den Namen einer * aktuellen * Klasse an. –

+0

Und wie der Kommentar sagt, es funktioniert nicht: P –

Antwort

8

In Ihrem Beispiel scheint es, dass Sie versuchen, das Attribut des Metas der Superklasse zu überschreiben. Warum nicht die Meta-Vererbung verwenden?

class MyCustomAuthentication(Authentication): 
    pass 

class SpecializedResource(ModelResource): 
    class Meta: 
     authentication = MyCustomAuthentication() 

class TestResource(SpecializedResource): 
    class Meta(SpecializedResource.Meta): 
     # just inheriting from parent meta 
     pass 
    print Meta.authentication 

Output:

<__main__.MyCustomAuthentication object at 0x6160d10> 

so dass die TestResource ‚s meta werden aus Mutter meta vererben (hier das Authentifizierungs-Attribut).

beantworten schließlich die Frage:

Wenn Sie es wirklich wollen zugreifen (beispielsweise Material zu einer übergeordneten Liste anhängen und so weiter), können Sie verwenden, zB:

class TestResource(SpecializedResource): 
    class Meta(SpecializedResource.Meta): 
     authentication = SpecializedResource.Meta.authentication # works (but hardcoding) 

oder ohne harte Kodierung die Super Klasse:

class TestResource(SpecializedResource): 
    class Meta(SpecializedResource.Meta): 
     authentication = TestResource.Meta.authentication # works (because of the inheritance) 
+0

Genau das habe ich gesucht, ohne es zu wissen. Vielen Dank! Tatsächlich ist es nicht notwendig, die Authentifizierung in TestResource zu deklarieren. Wenn Meta-Vererbung funktioniert, funktioniert es einfach. –

+0

Können Sie bestätigen, ob dies in Python 3.4 funktioniert? – Akhorus

Verwandte Themen