python 类属性继承

2 投票
4 回答
2223 浏览
提问于 2025-04-15 12:27

我想通过写下面的代码来减少一些输入的工作量,但似乎这样做不行:

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)

然后再继续进行修改。

撰写回答