Я работаю с классом Python, и у меня нет доступа на запись к его объявлению. Как я могу прикрепить собственный метод (например, __str__) к объектам, созданным из этого класса, без изменения объявления класса?
РЕДАКТИРОВАТЬ: Спасибо за все ваши ответы. Я перепробовал их все, но они не решили мою проблему. Вот минимальный пример, который, я надеюсь, прояснит проблему. Я использую swig для обертывания класса C ++, и цель состоит в том, чтобы переопределить __str__ функцию объекта, возвращаемого модулем swig. Я использую cmake для построения примера:
test.py
import example
ex = example.generate_example(2)
def prnt(self):
return str(self.x)
#How can I replace the __str__ function of object ex with prnt?
print ex
print prnt(ex)
example.hpp
struct example
{
int x;
};
example generate_example(int x);
example.cpp
#include "example.hpp"
#include <iostream>
example generate_example(int x)
{
example ex;
ex.x = x;
return ex;
}
int main()
{
example ex = generate_example(2);
std::cout << ex.x << "\n";
return 1;
}
example.i
%module example
%{
#include "example.hpp"
%}
%include "example.hpp"
CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})
find_package(PythonLibs)
include_directories(${PYTHON_INCLUDE_PATH})
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
set_source_files_properties(example.i PROPERTIES CPLUSPLUS ON)
swig_add_module(example python example.i example)
swig_link_libraries(example ${PYTHON_LIBRARIES})
if(APPLE)
set(CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS "${CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS} -flat_namespace")
endif(APPLE)
Чтобы собрать и запустить test.py, скопируйте все файлы в каталог и в этом каталоге запустите
cmake .
make
python test.py
Это приводит к следующему выводу:
<example.example; proxy of <Swig Object of type 'example *' at 0x10021cc40> >
2
Как видите, у объекта swig есть собственная функция str, и это то, что я пытаюсь переопределить.