2013-10-14 2 views
9

У меня есть некоторый код, как это для Django-Tastypie:Как получить доступ к мета атрибутам суперкласса в 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 

Я хотел бы знать, что было бы правильным методом доступа к мета-атрибутов суперкласса без жесткого кодирования имя суперкласса.

+0

В этом фрагменте вы указали, что имя суперкласса не жестко закодировано - 'super()' принимает имя класса * current *. –

+0

И, как говорится в комментарии, он не работает: P –

ответ

8

В вашем примере кажется, что вы пытаетесь переопределить атрибут мета суперкласса. Почему бы не использовать метанаследование?

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 

Выход:

<__main__.MyCustomAuthentication object at 0x6160d10> 

так что TestResource «s meta наследует от родительской меты (здесь атрибута проверки подлинности).

Наконец, отвечая на вопрос:

Если вы действительно хотите, чтобы получить доступ к нему (например, чтобы добавить товар в родительском списке и так далее), вы можете использовать свой пример:

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

или без жесткого кодированиясупер класс:

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

Это именно то, что я искал, не зная об этом. Спасибо! На самом деле, нет необходимости объявлять аутентификацию в TestResource. Когда мета-наследование работает, оно просто работает. –

+0

Можете ли вы подтвердить, работает ли это в Python 3.4? – Akhorus

Смежные вопросы