【发布时间】:2013-11-03 16:34:18
【问题描述】:
我有一个由多个子类继承的基类。此基类有一个方法 calc_func(self),它在子类中使用统一命名的方法 func(self)。这可行,但如果代码变得越来越复杂,这种“架构”将很难遵循。
# Base class
class base():
x = 12
def calc_func(self):
for i in range(1,4):
self.y += self.func()
# neither y nor func() are defined here so
# it is hard to know where they came from
# Child class 1
class child1(base):
y = 10
def __init__(self):
pass
def func(self): # method used in base class
self.x += self.y
print self.x
return self.x
# x was not defined here so it is
# hard to know where it came from
# Child class 2
class child2(base):
y = 15
def __init__(self):
pass
def func(self): # method used in base class
self.x *= self.y
print self.x
return self.x
# x was not defined here so it is
# hard to know where it came from
test1 = child1() # Create object
test1.calc_func() # Run method inherited from base class
test2 = child2() # Create another object
test2.calc_func() # Run method inherited from base class
这个想法是将通用代码抽象到基类中,但这似乎不是正确的做法。也许这可以通过使用引用其特定来源类的方法和属性的命名约定来更容易理解?也许完全不同的架构?任何建议将不胜感激。
【问题讨论】:
-
您可以使用
abc.ABCMeta元类使Base类抽象,然后在Base类中实现func并用@abstractmethod标记它。或者,简单地将def func(self): raise NotImplementedError()放在基类中可以提供一些关于func来自何处的线索。通过这种方式,您还可以向抽象func添加一些文档,说明它应该具有的属性,以便用户可以安全地派生该类并正确实现功能。 -
这实际上只是记录那些所谓的方法是什么的问题。这就是抽象方法的优势,你可以添加一个文档字符串,它会显示在基类和非覆盖子类中,告诉实现者发生了什么。
-
谢谢,我会试试这些建议
标签: python class inheritance structure base