我试图通过编写以下代码来节省一些打字,但似乎我不能这样做:
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"])
答案 0 :(得分:7)
继承在类的主体执行后应用。在类体中,您可以使用lgrAdminObject.fields
- 您确定要更改超类的属性,而不是首先复制它,但是?看起来很奇怪......我先从副本开始:
class Photos(lgrAdminObject):
fields = list(lgrAdminObject.fields)
继续改动之前。
答案 1 :(得分:4)
你试过这个吗?
fields = lgrAdminObject.fields + ["albums"]
您需要创建一个新的类属性,而不是从父类扩展它。
答案 2 :(得分: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 Martelli的建议并复制基本属性:
>>> class B0:
... fields = ["title","owner"]
...
>>> class C1(B0):
... fields = B0.fields[:]
... fields.extend(["albums"])
...
>>> C1.fields
['title', 'owner', 'albums']
>>> B0.fields
['title', 'owner']
>>>
答案 3 :(得分:1)
另外,请注意,当您将列表作为类属性时,它属于类,而不是实例。因此,如果您修改它,它将针对所有实例进行更改。使用元组可能更好,除非你打算用这种效果修改它(然后你应该清楚地记录,因为这是造成混淆的常见原因)。