python类属性继承

时间:2009-06-23 15:47:56

标签: python django class inheritance

我试图通过编写以下代码来节省一些打字,但似乎我不能这样做:

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 个答案:

答案 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)

另外,请注意,当您将列表作为类属性时,它属于类,而不是实例。因此,如果您修改它,它将针对所有实例进行更改。使用元组可能更好,除非你打算用这种效果修改它(然后你应该清楚地记录,因为这是造成混淆的常见原因)。