Создание класса Python в C #

Ну, что я могу сказать. Этим статьям 7-9 лет.

Теперь у нас есть> Java 1.5, где у нас есть полномочия перечисления enum. Согласно «Josh Block» Лучший способ написать одноэлемент - написать одноэлементное перечисление

public enum MySingleton{
    Singleton;

    // rest of the implementation.
    // ....
}

. Но для вашего вопроса, я думаю, нет никакой проблемы в использовании любой из реализаций. Я предпочитаю первый вариант, потому что его простой, простой для понимания.

Но следите за отверстиями в петле, чтобы мы могли одновременно создавать больше объектов этого класса в одной JVM, сериализуя и десериализовать объект или сделать клон объекта.

Также сделать класс окончательным, потому что мы можем нарушить Singleton, расширив класс.

43
задан bdukes 23 February 2009 в 20:50
поделиться

3 ответа

Классы IronPython не классы.NET. Они - экземпляры IronPython. Время выполнения. Типы. PythonType, который является метаклассом Python. Это вызвано тем, что классы Python являются динамичными и поддерживают дополнение и удаление методов во времени выполнения, вещи, которые Вы не можете сделать с классами.NET.

Для использования классов Python в C# необходимо будет использовать класс ObjectOperations. Этот класс позволяет Вам воздействовать на типы Python и экземпляры в семантике самого языка. например, это использует волшебные методы в надлежащих случаях, автопродвигает целые числа longs и т.д. Можно узнать больше о ObjectOperations путем рассмотрения источника или использования отражателя.

Вот пример. Calculator.py содержит простой класс:

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

можно использовать его от Вашего пред.NET 4.0 кода C# как это:

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, Microsoft. Сценарии и Microsoft. Сценарии. Ядро.

C# 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);

при использовании Visual Studio, 2010 или позже с поддержкой NuGet просто выполняет это, чтобы загрузить и сослаться на соответствующие библиотеки.

Install-Package IronPython
54
ответ дан m-sharp 24 February 2009 в 06:50
поделиться

Я искал высоко и низко и я боюсь, что, кажется, нет большой информации, имеющей отношение к этому. Я в значительной степени уверен, что никто не создал способ сделать это чистым способом, который Вы хотели бы.

главная причина я думаю, что это - проблема, то, что для наблюдения эти PokerCard тип в приложении C#, необходимо было бы скомпилировать код Python в IL. Я не полагаю, что существуют любые компиляторы IL Python -> там.

-4
ответ дан Andrew Hare 24 February 2009 в 06:50
поделиться
  • 1
    Я действительно хотел бы видеть часть, разъясненную, где поток записан в myAWSStream. Я хотел бы записать что-то в Azure устройство хранения данных Блоба вместо AWS. Но я don' t знают как (в методе GetStream) получать доступ к потоку. В этом методе я хотел бы сделать: BlobService. StoreImageToBlobFromStream (поток) – woutercx 2 November 2013 в 23:31

Теперь, когда .Net 4.0 выпущен и имеет динамический тип, этот пример следует обновить. Используя тот же файл python, что и в исходном ответе m-sharp:

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

Вот как вы бы назвали его, используя .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 и Microsoft.Scripting.

Как видите, первоначальная настройка и создание исходного файла такие же.

Но после успешного выполнения исходного кода работа с функциями python становится намного проще благодаря новому ключевому слову «dynamic».

31
ответ дан 26 November 2019 в 22:52
поделиться