我有两个班,一个共同的功能f
,喜欢这里:两个班级,结构相同的方法,但一个不同的命名变量
class ClassA(object):
def f(self, var):
self.A = g(var, self.A)
# specific code for ClassA, also changing self.A
class ClassB(object):
def f(self, var):
self.B = g(var, self.B)
# specific code for ClassB, also changing self.B
在两个班,f
做两个变量称为A
和B
相同,这在结构上是等同的。我想把f
它放到一个抽象类中以避免代码重复。要做到这一点的方法之一是
class ClassX(object):
def f(self, var):
self.X = g(var, self.X)
class ClassA(ClassX):
# specific code for ClassA, also changing self.X
class ClassB(ClassX):
# specific code for ClassB, also changing self.X
在这个解决方案中的变量A
和B
已更名X
。然而,为了让我的代码更加自我解释,我想保留X
这些特殊名称(如A
,B
)在特殊类中。
有没有办法做到这一点?
如果您可以建议更有意义的描述性标题,请对此留言,以便对社区更有价值。
编辑:该解决方案还应该工作,如果变量A
,B
采取这样一种类型,是通过按值,应假定这两个自己的价值和类型可以从类的外部程序执行过程中被改变。
我想补充一点,如果你确实有一个不同的属性有不同的名字,但你想对它们执行相同的处理,你应该使用独立的函数来处理。并非所有事物都属于一类。 –
谢谢,它有点多结构,但似乎使用'@ property'仍然是最简单的策略。但是,我已经改变了你的方法,并把它放到基类中,比如'@property def X(self):return self .__ getattribute __ [self.Xname]'并且分配一个属性'self.Xname',它是''A' '或''B'到初始化的具体类。这具有隐藏抽象基类中的结构并使代码简单的更具体派生类的优点。此外,如果我决定写另一个'ClassC',它将节省工作。 – flonk
好吧,如果这样做可以节省你很多工作,那么我真的认为你所有的类都应该具有相同的属性名称。启发式地讲,这是一个强烈的信号,你没有抽象地想到你的课程。但没有看到具体的代码,我无法确定。另外,我鼓励你按照Silas Ray的建议使用'getattr',而不是'__geattribute__',这是为了覆盖,而不是使用(参见[这里](http://stackoverflow.com/questions/1944625/what- is-the-relationship-between-getattr-and-getattr)for more)。 – senderle