python 中最接近虚拟通话的事情

Closest thing to a virtual call in python

Python 不提供一些内置的继承机制来调用基方法

派生的 class 中的基虚拟或抽象方法的实现

我想知道 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

您只需自己拨打电话即可。从语法上讲,这不会比您设置的装饰器更重。

class Derived(Base):
    def some_abstract_interface(self, **params):
        self.some_base_impl()
        print('actual logic her {0}.format(params))

事实上,你甚至不需要将some_base_implsome_abstract_interace分开;一个抽象方法可以有一个实现,但仍然需要覆盖。

from abc import ABC, abstractmethod


class Base(ABC):
    @abstractmethod
    def some_abstract_interface(self, **params):
        pass  # Put base implementation here


class Derived(Base):
    def some_abstract_interface(self, **params):
        super().some_abstract_interface(**params)
        print("actual logic here {0}".format(params))

你已经可以在没有任何简洁装饰器的情况下做到这一点:

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()

这输出:

actual logic here

如果你想强制 Base 是一个抽象 class 并且不能用于直接实例化对象,并且 some_abstract_interface 意味着是一个抽象方法并且总是必须被子 class 方法的实现覆盖,您可以使基础 class 继承自 abc 模块的 ABC class并用 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()