наследование атрибутов класса Python - PullRequest
2 голосов
/ 23 июня 2009

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

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"])

Ответы [ 4 ]

7 голосов
/ 23 июня 2009

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

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

прежде чем продолжить с изменениями.

4 голосов
/ 23 июня 2009

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

fields = lgrAdminObject.fields + ["albums"]

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

2 голосов
/ 23 июня 2009

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

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']
>>> 

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

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

>>> class B0:
...     fields = ["title","owner"]
... 
>>> class C1(B0):
...     fields = B0.fields[:]
...     fields.extend(["albums"])
...     
>>> C1.fields
['title', 'owner', 'albums']
>>> B0.fields
['title', 'owner']
>>> 
1 голос
/ 23 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...