2009-06-23 147 views
2

我想我自己节省一点通过编写下面的代码打字的,但似乎我不能做到这一点:Python类属性继承

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 2009-06-23 16:16:43

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

另外请注意,当你有一个清单作为一个阶级属性,它属于类,而不是实例。所以如果你修改它,它会改变所有的实例。除非你打算用这个效果来修改它,否则使用一个元组可能会更好(然后你应该清楚地记录它,因为这是造成混淆的常见原因)。