Skip to main content
 首页 » 编程设计

python之如何在 BaseClass 方法被 Python 中的 DerivedClass 方法覆盖之前执行它

2025年05月04日11lhb25

我几乎可以肯定我想做的事情有一个合适的术语,但由于我不熟悉它,我将尝试明确地描述整个想法。所以我拥有的是一组类,它们都继承自一个基类。所有类几乎完全由不同的方法组成,这些方法仅在每个类中相关。然而,有几种方法具有相似的名称、通用功能和一些逻辑,但它们的实现仍然大不相同。所以我想知道是否有可能在基类中创建一个方法,该方法将执行一些类似于所有方法的逻辑,但仍继续在类特定方法中执行。希望这是有道理的,但我会尝试给出一个我想要的基本示例。

所以考虑一个看起来像这样的基类:

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