मैं एक पायथन कक्षा के साथ काम कर रहा हूं, और मेरे पास इसकी घोषणा के लिए लेखन पहुंच नहीं है। कक्षा घोषणा के संशोधन के बिना उस वर्ग से बनाए गए ऑब्जेक्ट्स में मैं एक कस्टम विधि (जैसे __str__
) कैसे संलग्न कर सकता हूं?स्विग के साथ उत्पन्न मौजूदा पायथन ऑब्जेक्ट को गतिशील रूप से एक विधि संलग्न करना?
संपादित करें: आपके सभी उत्तरों के लिए धन्यवाद। मैंने उन सभी की कोशिश की लेकिन उन्होंने मेरी समस्या का समाधान नहीं किया है। यहां एक न्यूनतम उदाहरण दिया गया है कि मुझे आशा है कि इस मुद्दे को स्पष्ट किया जाएगा। मैं एक सी ++ वर्ग को लपेटने के लिए स्विग का उपयोग कर रहा हूं, और इसका उद्देश्य का एक ऑब्जेक्ट स्विग मॉड्यूल द्वारा लौटाया गया है। मैं 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
जैसा कि आप देख सकते हैं कि स्विग ऑब्जेक्ट का अपना str फ़ंक्शन है, और यही वह है जिसे मैं ओवरराइड करने की कोशिश कर रहा हूं।
अन्य StackOverflow सवाल: http://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object –