在python中最接近虚拟调用的东西

lur*_*her 1 python abstract-class virtual-functions python-3.x

Python没有提供内置的继承机制来从基本方法中调用派生类中的基本虚拟或抽象方法的实现

我想知道python中最接近的东西是什么,它将提供以下结构:

class Base(?):
   def some_abstract_interface(self, **params):
     raise Unimplemented()
   def some_base_impl(self):
     self.some_abstract_interface(self, a=4, b=3, c=2)


class Derived(Base):

   @neat_override_decorator_here? 
   def some_abstract_interface(self, **params):
     print("actual logic here {0}".format(params))

d = Derived()
d.some_base_impl()
>>>output: actual logic here a=4, b=3, c=2
Run Code Online (Sandbox Code Playgroud)

blh*_*ing 6

您无需任何整洁的装饰器就可以做到这一点:

class Base:
    def some_abstract_interface(self):
        raise NotImplemented

    def some_base_impl(self):
        self.some_abstract_interface()

class Derived(Base):
    def some_abstract_interface(self):
        print('actual logic here')

Derived().some_base_impl()
Run Code Online (Sandbox Code Playgroud)

输出:

actual logic here
Run Code Online (Sandbox Code Playgroud)

如果您要强制执行的Base是抽象类,并且不能用于直接实例化对象,而这some_abstract_interface意味着它是一种抽象方法,并且始终必须由子类的方法实现覆盖,则可以使基类继承自模块的ABC类,abc并使用abc.abstractmethod如下装饰抽象方法:

import abc

class Base(abc.ABC):
    @abc.abstractmethod
    def some_abstract_interface(self):
        raise NotImplemented

    def some_base_impl(self):
        self.some_abstract_interface()

class Derived(Base):
    def some_abstract_interface(self):
        print('actual logic here')

Derived().some_base_impl()
Run Code Online (Sandbox Code Playgroud)