2009-02-23 10 views
40

में एक अजगर वर्ग मैं अजगर में एक वर्ग है कि मैं IronPython के माध्यम से एक .net विधानसभा में लपेट और एक सी # आवेदन में दृष्टांत करना चाहते लिखा है। मैंने क्लास को आयरनपीथन पर माइग्रेट कर दिया है, लाइब्रेरी असेंबली बनाई है और इसे संदर्भित किया है। अब, मैं वास्तव में उस वर्ग का उदाहरण कैसे प्राप्त करूं?instantiating सी #

वर्ग दिखता है (आंशिक रूप से) इस तरह:

class PokerCard: 
    "A card for playing poker, immutable and unique." 

    def __init__(self, cardName): 

परीक्षण ठूंठ मैं सी # में लिखा है:

using System; 

namespace pokerapp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var card = new PokerCard(); // I also tried new PokerCard("Ah") 
      Console.WriteLine(card.ToString()); 
      Console.ReadLine(); 
     } 
    } 
} 

क्या मैं आदेश सी # में इस वर्ग का दृष्टांत में मुझे क्या करना होगा ?

उत्तर

51

आयरनपीथन कक्षा .NET कक्षाएं नहीं हैं। वे IronPython.Runtime.Types.PythonType जो अजगर metaclass है के उदाहरण हैं। ऐसा इसलिए है क्योंकि पाइथन कक्षाएं गतिशील और समर्थन के अतिरिक्त हैं और रनटाइम पर विधियों को हटाने, चीजें जो आप .NET कक्षाओं के साथ नहीं कर सकते हैं।

सी # में पायथन कक्षाओं का उपयोग करने के लिए आपको ऑब्जेक्टऑपरेशंस क्लास का उपयोग करने की आवश्यकता होगी। यह वर्ग आपको भाषा के अर्थशास्त्र में पाइथन प्रकारों और उदाहरणों पर काम करने की अनुमति देता है। जैसे यह उचित होने पर जादू विधियों का उपयोग करता है, लंबे समय तक इंटीग्रेट्स को ऑटो-प्रोमोट करता है। आप स्रोत को देखकर या परावर्तक का उपयोग करके ऑब्जेक्टऑपरेशंस के बारे में अधिक जानकारी प्राप्त कर सकते हैं।

यहाँ एक उदाहरण है।

class Calculator(object): 
    def add(self, a, b): 
     return a + b 

आप इस तरह अपने पूर्व .NET 4.0 सी # कोड से इसका इस्तेमाल कर सकते हैं::

ScriptEngine engine = Python.CreateEngine(); 
ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py"); 
ScriptScope scope = engine.CreateScope(); 

ObjectOperations op = engine.Operations; 

source.Execute(scope); // class object created 
object klaz = scope.GetVariable("Calculator"); // get the class object 
object instance = op.Call(klaz); // create the instance 
object method = op.GetMember(instance, "add"); // get a method 
int result = (int)op.Call(method, 4, 5); // call method and get result (9) 

आप विधानसभाओं IronPython.dll, माइक्रोसॉफ्ट को संदर्भित करने की आवश्यकता होगी Calculator.py एक साधारण वर्ग में शामिल है। स्क्रिप्टिंग और माइक्रोसॉफ्ट .स्क्रिप्टिंग। कोर।

सी # 4 नया गतिशील प्रकार के साथ यह इतना आसान बना दिया।

ScriptEngine engine = Python.CreateEngine(); 
ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py"); 
ScriptScope scope = engine.CreateScope(); 
source.Execute(scope); 

dynamic Calculator = scope.GetVariable("Calculator"); 
dynamic calc = Calculator(); 
int result = calc.add(4, 5); 

आप दृश्य स्टूडियो 2010 या बाद में NuGet समर्थन के साथ प्रयोग कर रहे हैं, तो बस इस पर अमल डाउनलोड करने और उचित लाइब्रेरियों को संदर्भित करने।

Install-Package IronPython 
+1

मेरे पास नहीं है नए गतिशील प्रकार के साथ

# Compile IronPython calculator class to a dll clr.CompileModules("calculator.dll", "calculator.py") 

सी # 4.0 कोड इस प्रकार है इसे संपादित करने के लिए प्रतिनिधि , लेकिन Calculator.py नमूना में, पहला "def" इंडेंट होना चाहिए। महान उदाहरण है, हालांकि! बहुत उपयोगी। अब .Net 4.0 बाहर है, अपडेटेड उदाहरण देखना अच्छा लगेगा। –

+5

एक नेट 4.0 उदाहरण जोड़ा गया, अपने ही कैलक्यूलेटर नमूना वर्ग का उपयोग कर। –

+0

धन्यवाद, मैंने इंडेंट जोड़ा। –

-4

मैं उच्च और निम्न खोज की है और मुझे डर है कि इस से संबंधित अधिक से अधिक जानकारी हो प्रतीत नहीं होता हूँ। मैं बहुत निश्चित हूं कि किसी ने भी इसे साफ तरीके से करने का कोई तरीका नहीं बनाया है जिसे आप चाहें।

मुख्य कारण मुझे लगता है कि यह एक समस्या है कि PokerCard अपने सी # एप्लिकेशन में टाइप करने के लिए आपको अपने पायथन कोड को आईएल में संकलित करना होगा। मुझे विश्वास नहीं है कि वहाँ कोई पाइथन -> आईएल कंपाइलर्स हैं।

31

अब .NET 4.0 जारी किया गया है और गतिशील प्रकार है, यह उदाहरण अपडेट किया जाना चाहिए। एम-तेज के मूल जवाब में के रूप में ही अजगर फ़ाइल का उपयोग करना:

string scriptPath = "Calculator.py"; 
ScriptEngine engine = Python.CreateEngine(); 
engine.SetSearchPaths(new string[] {"Path to your lib's here. EG:", "C:\\Program Files (x86)\\IronPython 2.7.1\\Lib"}); 
ScriptSource source = engine.CreateScriptSourceFromFile(scriptPath); 
ScriptScope scope = engine.CreateScope(); 
ObjectOperations op = engine.Operations; 
source.Execute(scope); 

dynamic Calculator = scope.GetVariable("Calculator"); 
dynamic calc = Calculator(); 
return calc.add(x,y);   

फिर से, आप IronPython.dll के लिए संदर्भ जोड़ने की जरूरत:

class Calculator(object): 
    def add(self, a, b): 
     return a + b 

यहाँ आप यह कैसे नेट 4.0 का उपयोग कर कहेंगे है और माइक्रोसॉफ्ट .स्क्रिप्टिंग।

आप देख सकते हैं, प्रारंभिक स्थापना और स्रोत फ़ाइल का निर्माण एक ही है।

लेकिन एक बार स्रोत सफलतापूर्वक क्रियान्वित किया जाता है, अजगर कार्यों के साथ काम करने के लिए नए "गतिशील" कीवर्ड के काफी आसान धन्यवाद है।

+0

उदाहरण जोड़ने के लिए धन्यवाद! –

+0

यह वास्तव में मदद की! –

0

मैं एक .py फ़ाइल में संकलित IronPython वर्गों (dll) के बजाय IronPython स्रोत कोड के लिए चालाक मानव द्वारा प्रदान ऊपर के उदाहरण को अद्यतन करने कर रहा हूँ।

// IRONPYTHONPATH environment variable is not required. Core ironpython dll paths should be part of operating system path. 
ScriptEngine pyEngine = Python.CreateEngine(); 
Assembly myclass = Assembly.LoadFile(Path.GetFullPath("calculator.dll")); 
pyEngine.Runtime.LoadAssembly(myclass); 
ScriptScope pyScope = pyEngine.Runtime.ImportModule("calculator"); 
dynamic Calculator = pyScope.GetVariable("Calculator"); 
dynamic calc = Calculator(); 
int result = calc.add(4, 5); 

संदर्भ::

  1. Using Compiled Python Classes from .NET/CSharp IP 2.6
  2. Static Compilation of IronPython scripts
संबंधित मुद्दे