我正在使用Python類,並且我沒有對其聲明的寫入權限。 如何在不修改類聲明的情況下將自定義方法(如__str__
)附加到從該類創建的對象?編輯: 謝謝你的所有答案。我嘗試了所有,但他們還沒有解決我的問題。這是我希望澄清問題的一個最小例子。我正在使用swig來包裝一個C++類,目的是覆蓋swig模塊返回的對象的__str__
函數。我使用的cmake構建示例:將方法動態附加到使用swig生成的現有Python對象?
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函數,這就是我想重寫的。
其他StackOverflow的問題:http://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object – 2009-09-05 11:43:44