2009-06-23 3 views
2

Я пытаюсь спасти себя немного набрав, написав следующий код, но мне кажется, я не могу это сделать:питона атрибут класса наследование

class lgrAdminObject(admin.ModelAdmin): 
    fields = ["title","owner"] 
    list_display = ["title","origin","approved", "sendToFrames"] 

class Photos(lgrAdminObject): 
    fields.extend(["albums"]) 

почему не работает? Кроме того, поскольку они не функции, я не могу сделать супер трюк

fields = super(Photos, self).fields 
fields.extend(["albums"]) 

ответ

7

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

class Photos(lgrAdminObject): 
    fields = list(lgrAdminObject.fields) 

перед продолжением изменений.

+0

Я просто привел пример, но вы правы, я бы хотел скопировать список прежде, чем его изменить;) – Jiaaro

4

Вы пробовали это?

fields = lgrAdminObject.fields + ["albums"] 

Вам необходимо создать новый атрибут класса, а не расширять его из родительского класса.

2

Если вы настаиваете на использовании атрибутов класса, вы можете напрямую ссылаться на базовый класс.

class Photos(lgrAdminObject): 
    lgrAdminObject.fields.extend(["albums"]) 

Простейшая проверка следующим образом:

>>> class B0: 
...  fields = ["title","owner"] 
...  
>>> class C1(B0): 
...  B0.fields.extend(["albums"]) 
...  
>>> C1.fields 
['title', 'owner', 'albums'] 
>>> B0.fields 
['title', 'owner', 'albums'] 
>>> 

Похоже атрибут база модифицируется, а также, вероятно, не то, что вы искали. Посмотрите на определение некоторого исполняемого метода (__init__(), может быть?).

Или (лучше?) Последовать совету @Alex Мартелли и скопировать базовый атрибут:

>>> class B0: 
...  fields = ["title","owner"] 
... 
>>> class C1(B0): 
...  fields = B0.fields[:] 
...  fields.extend(["albums"]) 
...  
>>> C1.fields 
['title', 'owner', 'albums'] 
>>> B0.fields 
['title', 'owner'] 
>>> 
1

Кроме того, обратите внимание, что, когда у вас есть список как атрибут класса, он принадлежит к классу, а не экземпляры , Поэтому, если вы измените его, он изменится для всех экземпляров. Вероятно, лучше использовать кортеж вместо этого, если вы не намерены модифицировать его с помощью этого эффекта (и тогда вы должны четко документировать, потому что это общая причина путаницы).

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