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"])
4 个回答
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']
>>>
4
你试过这样做吗?
fields = lgrAdminObject.fields + ["albums"]
你需要创建一个新的类属性,而不是去扩展父类里的那个属性。
7
继承是在类的主体执行之后才生效的。在类的主体中,你可以使用 lgrAdminObject.fields
—— 不过你确定要直接修改父类的属性,而不是先复制一份吗?这样做听起来有点奇怪……我建议你先复制一份:
class Photos(lgrAdminObject):
fields = list(lgrAdminObject.fields)
然后再继续进行修改。