免责声明:这与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'
是否有任何使用语句的唯一标识为每个控制器,而代码只驻留在一个地方? (抽象控制器)
答案 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]"