Python类属性继承
问题描述:
我想我自己节省一点通过编写下面的代码打字的,但似乎我不能做到这一点: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"])
答
继承适用类的身体执行后。在课程正文中,您可以使用lgrAdminObject.fields
- 但您确定要改变超类的属性,而不是先制作它的副本?与变更,然后再继续
class Photos(lgrAdminObject):
fields = list(lgrAdminObject.fields)
:似乎奇怪......我会用复制开始。
答
你试过这个吗?
fields = lgrAdminObject.fields + ["albums"]
您需要创建一个新的类属性,而不是从父类中扩展一个。
答
如果你坚持使用类属性,你可以直接引用基类。
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']
>>>
答
另外请注意,当你有一个清单作为一个阶级属性,它属于类,而不是实例。所以如果你修改它,它会改变所有的实例。除非你打算用这个效果来修改它,否则使用一个元组可能会更好(然后你应该清楚地记录它,因为这是造成混淆的常见原因)。
我只是举了一个例子,但你说得对,我想在改变它之前先复制列表;) – Jiaaro 2009-06-23 16:16:43