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

时间:2019-09-23 16:44:12

标签: python python-3.x abstract-class virtual-functions

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

我想知道python中最能提供以下结构的东西是什么

while

2 个答案:

答案 0 :(得分: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()

这将输出:

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

答案 1 :(得分:4)

您只需自己拨打电话即可。从句法上讲,这不会再重,而是您放置的装饰器。

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