【问题标题】:python class attribute inheritancepython类属性继承
【发布时间】:2009-06-23 15:47:56
【问题描述】:

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

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

【问题讨论】:

    标签: python django class inheritance


    【解决方案1】:

    继承在类的主体执行之后应用。在类主体中,您可以使用lgrAdminObject.fields——您确定要更改超类的属性而不是先复制它吗?看起来很奇怪...我先从副本开始:

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

    在继续修改之前。

    【讨论】:

    • 我只是举个例子,但你是对的,我想在更改之前先复制列表;)
    【解决方案2】:

    你试过了吗?

    fields = lgrAdminObject.fields + ["albums"]
    

    你需要创建一个新的类属性,而不是继承父类的属性。

    【讨论】:

      【解决方案3】:

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

      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】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-02
          • 2012-07-25
          • 2015-03-27
          • 1970-01-01
          • 2011-01-30
          • 2016-11-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多