我几乎可以肯定我想做的事情有一个合适的术语,但由于我不熟悉它,我将尝试明确地描述整个想法。所以我拥有的是一组类,它们都继承自一个基类。所有类几乎完全由不同的方法组成,这些方法仅在每个类中相关。然而,有几种方法具有相似的名称、通用功能和一些逻辑,但它们的实现仍然大不相同。所以我想知道是否有可能在基类中创建一个方法,该方法将执行一些类似于所有方法的逻辑,但仍继续在类特定方法中执行。希望这是有道理的,但我会尝试给出一个我想要的基本示例。
所以考虑一个看起来像这样的基类:
class App(object):
def __init__(self, testName):
self.localLog = logging.getLogger(testName)
def access(self):
LOGIC_SHARED
还有一个派生类的例子:
class App1(App):
def __init__(self, testName):
. . .
super(App1, self).__init__(testName)
def access(self):
LOGIC_SPECIFIC
所以我想实现的是基类access方法中的LOGIC_SHARED部分在调用access方法时执行任何 App 类之前 执行LOGIC_SPECIFIC 部分(正如它所说)特定于每个 access 所有派生类的方法。
如果这有什么不同的话,LOGIC_SHARED 主要由日志记录和维护任务组成。
希望已经足够清楚并且这个想法有意义。
注意 1: LOGIC_SHARED 部分中使用了特定于类的参数。
注意 2: 仅使用 Python 内置函数和模块来实现该行为很重要。
注意事项 3: LOGIC_SHARED 部分看起来像这样:
try:
self.localLog.info("Checking the actual link for %s", self.application)
self.link = self.checkLink(self.application)
self.localLog.info("Actual link found!: %s", self.link)
except:
self.localLog.info("No links found. Going to use the default link: %s", self.link)
因此,我使用了很多特定的类实例属性,但我不确定如何使用基类中的这些属性。
请您参考如下方法:
当然可以,把具体的逻辑放在它自己的“私有(private)”函数中,可以被派生类覆盖,把access留给Base。
class Base(object):
def access(self):
# Shared logic 1
self._specific_logic()
# Shared logic 2
def _specific_logic(self):
# Nothing special to do in the base class
pass
# Or you could even raise an exception
raise Exception('Called access on Base class instance')
class DerivedA(Base):
# overrides Base implementation
def _specific_logic(self):
# DerivedA specific logic
class DerivedB(Base):
# overrides Base implementation
def _specific_logic(self):
# DerivedB specific logic
def test():
x = Base()
x.access() # Shared logic 1
# Shared logic 2
a = DerivedA()
a.access() # Shared logic 1
# Derived A specific logic
# Shared logic 2
b = DerivedB()
b.access() # Shared logic 1
# Derived B specific logic
# Shared logic 2
