python覆盖内部Meta类属性

时间:2014-09-09 18:30:29

标签: python django

免责声明:这与django无关。我只是将它标记为Django,因为django具有非常相似的对象结构,并且知识可以是可交换的。

我正在使用水泥cli框架,我正在尝试更改使用声明。这更像是一个python继承问题,而不是一个水泥问题。这是我的一个例子:

class AbstractBaseController(controller.CementBaseController):
    class Meta:
        label = 'base'
        usage = 'foo ' + label + ' [options. .]'

class BarController(AbstractBaseController):
    class Meta:
        label = 'bar'

现在,让我解释一下这里发生了什么。我有多个控制器(不仅仅是条形控制器),我希望它们都从AbstractBaseController.Meta继承使用属性,但是,我希望用法语句使用新标签,而不是Abstract标签。 这里的主要目标是让用法语句适用于每个控制器,而无需将其复制并粘贴到每个控制器。现在,该用法继承为'foo base [options. .]',因为在进行替换之前它不会替换label。

我尝试了以下内容:

class AbstractBaseController(controller.CementBaseController):
    class Meta:
        label = 'base'
        usage = 'foo {cmd} [options. .]'

class BarController(AbstractBaseController):
    class Meta:
        label = 'bar'
        usage = AbstractBaseController.Meta.usage.replace('{cmd}', label)

这很有效。但是,我仍然有复制和粘贴问题,因为我必须将此用法cmd复制到每个控制器中。

我也试过这个:

class AbstractBaseController(controller.CementBaseController):
    class Meta:
        label = 'base'
        usage = 'foo {cmd} [options. .]'
        def __init__(self):
            self.usage = 'foo ' + self.label + ' [options]'

class BarController(AbstractBaseController):
    class Meta(AbstractBaseController.Meta):
        label = 'bar'

但这似乎没有做任何事情。即使使用__init__,我仍然会usage = 'foo {cmd}'而不是usage = 'foo base'

是否有任何使用语句的唯一标识为每个控制器,而代码只驻留在一个地方? (抽象控制器)

1 个答案:

答案 0 :(得分:0)

为什么不使用方法?

class A : 
    class SubA:
        label = 'base'
        def __init__(self) :
            self.usage = 'foo '+self.label+' [options]'
class B() :
    class SubB(A.SubA) :
        label = 'bar'

a = A().SubA()
b = B().SubB()
print(a.usage) # "foo base [options]"
print(b.usage) # "foo bar [options]"