最接近 python 中的虚拟调用



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

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

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是一个抽象类,不能用于直接实例化对象,并且该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()

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

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

最新更新