AttributeError: 'Foo'对象没有属性'max

0 投票
1 回答
1449 浏览
提问于 2025-04-18 07:35

我正在尝试从Python中调用一个C++函数。以下是我在Python中的代码:

from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')

class Foo(object):
    def __init__(self):
        self.obj = lib.Foo_new()

    def bar(self):
        lib.Foo_bar(self.obj)

    def max(self,num1,num2):
        lib.Foo_max(self.obj)

f = Foo()
f.bar()
f.max(3,5)

但是我遇到了一个属性错误,错误信息是:

Hello
Traceback (most recent call last):
  File "Linkcpp.py", line 16, in <module>
    f.max(3,5)
AttributeError: 'Foo' object has no attribute 'max'

请告诉我上面代码的正确写法。

我的C++代码是foo.cpp:

#include <iostream>

class Foo{
    public:
        void bar(){
            std::cout << "Hello" << std::endl;
        }

        int max(int num1,int num2) 
        {
          // local variable declaration
          int result;

          if (num1 > num2)
            result = num1;
          else
            result = num2;

          return result; 
        }
};

extern "C" {
    int num1;
    int num2;
    Foo* Foo_new(){ return new Foo(); }
    void Foo_bar(Foo* foo){ foo->bar(); }
    int Foo_max(Foo* foo){ return foo->max(num1,num2); }
}

我用以下命令来编译C++代码:

g++ -c -fPIC foo.cpp -o foo.o

g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o

1 个回答

3

你在代码里混用了制表符和空格。这意味着你的 Foo 类里有一个 max 方法,但实际上因为你混用了制表符和空格,max 的定义其实是在 bar 方法里面的。

下次在你的编辑器里打开“显示空白字符”的选项,这样你就能看到这些问题了。如果你用 -tt 这个命令来运行 Python,当 Python 检测到你混用了制表符和空格时,会给你提示错误信息,这也很有帮助。

撰写回答