强制重写方法调用基本方法实现

问题描述 投票:0回答:2
class Base:
    def method(self):
        print("Base method called")

class Derived(Base):
    def method(self):
        print("Derived method called")

我想找到一种方法让派生方法自动调用基本方法实现,或者更好的是,在调用派生方法之前强制调用基本方法。

例如:

derived = Derived() derived.method()
所需输出:

Base method called Derived method called
我想避免在派生方法中显式调用基方法。

我尝试搞乱

__init_subclass__

黑客:

class Base: def __init_sublcass__(cls, *args, **kwargs): def wrapper(self): super().method() self.method() cls.method = wrapper def method(self): print("Base method called")
它可以工作,但 pylance 有问题,而且它并不理想或易于理解。

python polymorphism subclass python-decorators metaclass
2个回答
0
投票
我认为您可能会强制

method()

 始终使用元类调用 
Base.method()

像这样的东西怎么样:

class Base_Meta(type): def __init__(cls, name, bases, dct): def method_new(self): Base.method(self) cls.method_old(self) if cls.__name__ != "Base": cls.method_old = cls.method cls.method = method_new class Base(metaclass=Base_Meta): def method(self): print("Base method called") class Derived(Base): def method(self): print("Derived method called") d = Derived() d.method()
我想这会给你:

Base method called Derived method called
    

0
投票
您可以编写一个装饰器来找到正确的基本方法并在常规方法之前调用该方法:

def callBaseMethod(f): def wrapper(*args, **kwargs): self, *rest = args base = getattr(super(self.__class__, self), f.__name__) base(*rest, **kwargs) f(*args, **kwargs) return wrapper class Base: def method(self): print("Base method called") class Derived(Base): @callBaseMethod def method(self): print("Derived method called") def main(): derived = Derived() derived.method()
按要求输出

© www.soinside.com 2019 - 2024. All rights reserved.