代码之家  ›  专栏  ›  技术社区  ›  Jiaaro

python类属性继承

  •  2
  • Jiaaro  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  7
  •   Alex Martelli    15 年前

    lgrAdminObject.fields --你确定要改变超类的属性而不是先复制它吗?看起来很奇怪。。。我从一份副本开始:

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

    在继续修改之前。

        2
  •  4
  •   Ber    15 年前

    fields = lgrAdminObject.fields + ["albums"]
    

    您需要创建一个新的类属性,而不是从父类扩展该属性。

        3
  •  2
  •   gimel    15 年前

    如果坚持使用类属性,则可以直接引用基类。

    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']
    >>> 
    
        4
  •  1
  •   Lennart Regebro    15 年前