2012-01-12 17 views
5

मैं अपने बड़ा घूँट टेम्पलेट वर्ग के लिए एक नई विधि को जोड़ने के लिए, उदाहरण के लिए जरूरत के लिए नई विधि जोड़ेंएक अजगर बड़ा घूँट खाका वर्ग

%template(DoubleVector) vector<double>; 

इस एक वर्ग कुछ उत्पन्न तरीकों के साथ उत्पन्न .py फ़ाइल में "DoubleVector" नाम उत्पन्न होगा। मान लीजिए कि वे func1(), func2() और func3() हैं। ये जेनरेट किए गए फ़ंक्शंस हैं और मेरे पास उनका कोई नियंत्रण नहीं है। अब, अगर मैं इस वर्ग (डबल वेक्टर) में "func4()" नामक एक नई विधि जोड़ना चाहता हूं, तो मैं इसे कैसे कर सकता हूं? क्या यह संभव है?

मैं एक पहचानकर्ता बुलाया% pythoncode के बारे में पता है, लेकिन मैं इसका इस्तेमाल नहीं कर सकता है इस टेम्पलेट कक्षा में एक नया कार्य परिभाषित करने के लिए।

+0

मुझे लगता है आप का मतलब '% टेम्पलेट (DoubleVector) वेक्टर ;'? – Flexo

+0

या, मुझे खेद है, मेरा मतलब% टेम्पलेट (डबल वेक्टर) वेक्टर ; केवल। धन्यवाद :) – Saurabh

उत्तर

9

को देखते हुए एक अंतरफलक फ़ाइल की तरह:

%extend std::vector<double> { 
    void bar() { 
    // don't for get to #include <iostream> where you include vector: 
    std::cout << "Hello from bar" << std::endl;  
    } 
} 

इस है:

%module test 

%{ 
#include <vector> 
%} 

%include "std_vector.i" 
%template(DoubleVector) std::vector<double>; 

DoubleVector में अधिक कार्यक्षमता जोड़ने के लिए सबसे आसान तरीका है %extend का उपयोग कर सी ++ में यह लिखने के लिए, बड़ा घूँट इंटरफ़ेस फ़ाइल में है लाभ यह है कि यह किसी भी भाषा के लिए काम करेगा जो आप SWIG के साथ लक्षित करते हैं, न केवल पायथन।

आप भी इसे %pythoncode और एक unbound function जरिए कर सकते हैं:

%pythoncode %{ 
def foo (self): 
     print "Hello from foo" 

DoubleVector.foo = foo 
%} 

उदाहरण इस चल:

Python 2.6.7 (r267:88850, Aug 11 2011, 12:16:10) 
[GCC 4.6.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import test 
>>> d = test.DoubleVector() 
>>> d.foo() 
Hello from foo 
>>> d.bar() 
Hello from bar 
>>> 
+1

चाल पूर्ण टेम्पलेट नाम, नहीं संक्षिप्त नाम extend' '% करने के लिए है। उदा।,%% Std :: वेक्टर 'बढ़ाएं,'% डबलवेंटर का विस्तार नहीं करें '। –

+0

@ पॉल आप किसी भी नाम के साथ कक्षा परिभाषा के भीतर% विस्तार का भी उपयोग कर सकते हैं और यह वर्तमान कक्षा पर लागू होता है। स्विग लाइब्रेरी इसका काफी उपयोग करता है। (स्वयं) '% std :: वेक्टर {% pythoncode% का विस्तार {def foo: – Flexo

+1

असीम कार्य करने के लिए इसके अलावा, यह संभव हो सकता है और साथ ही घोंसला करने के लिए'% pythoncode' '% extend' ब्लॉक में लगता है पास %}}; ' – user1556435

संबंधित मुद्दे