关于从c ++转换为python:从c ++转换为python – 如何在python中声明一个没有定义的虚方法

Converting from c++ to python - How to declare a virtual method with no definition in python

我正在尝试把C++库转换成Python。

C++文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
  public:
    virtual void example(paramtype, paramtype) = 0;
    void myMethod(void);
}

void A::myMethod(void){
    example();
}

class B: public A
{
  public:
    void example(paramtype p1, paramtype p2); // implemented
}

我很难实现MyMethod。我想制作一个变量来保存示例方法并调用mymethod中的变量,如下所示。

python文件

1
2
3
4
5
6
class A:
    def __init__(self):
        self.example = None

    def myMethod(self):
        self.example()

但是编辑说没有一种类型不能被调用(当然)。我怎样才能做到这一点?


若要将C++代码转换为Python 3,则应该从Python的抽象基类(ABC)派生。这样可以创建抽象方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
from abc import ABC, abstractmethod


class A(ABC):
    def __init__(self):
        pass

    @abstractmethod
    def example(self, a, b):
        raise NotImplementedError

    def my_method(self):
        self.example(1, 2)

其他信息可以在这里找到:https://docs.python.org/3/library/abc.html


C++中的基类是声明一个没有定义的虚拟方法。

1
virtual void example(paramtype, paramtype) = 0;

这意味着它必须在要使用的子类中定义。在您的库中,这是B类。

在python中,可以使用

1
raise NotImplementedError()

以指示尚未实现方法。有关详细信息,请参阅此答案。

1
2
3
4
5
6
7
8
9
10
11
class A:
    def example(self):
        raise NotImplementedError()

    def myMethod(self):
        self.example()

class B(A):
    # override the example method by providing the implementation
    def example(self):
        # implementation

在本例中,对A类型的对象调用example将引发错误,因为该方法未定义。只能对B类型的对象调用该方法。