Ну, что я могу сказать. Этим статьям 7-9 лет.
Теперь у нас есть> Java 1.5, где у нас есть полномочия перечисления enum
. Согласно «Josh Block» Лучший способ написать одноэлемент - написать одноэлементное перечисление
public enum MySingleton{
Singleton;
// rest of the implementation.
// ....
}
. Но для вашего вопроса, я думаю, нет никакой проблемы в использовании любой из реализаций. Я предпочитаю первый вариант, потому что его простой, простой для понимания.
Но следите за отверстиями в петле, чтобы мы могли одновременно создавать больше объектов этого класса в одной JVM, сериализуя и десериализовать объект или сделать клон объекта.
Также сделать класс окончательным, потому что мы можем нарушить Singleton, расширив класс.
Классы 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
Я искал высоко и низко и я боюсь, что, кажется, нет большой информации, имеющей отношение к этому. Я в значительной степени уверен, что никто не создал способ сделать это чистым способом, который Вы хотели бы.
главная причина я думаю, что это - проблема, то, что для наблюдения эти PokerCard
тип в приложении C#, необходимо было бы скомпилировать код Python в IL. Я не полагаю, что существуют любые компиляторы IL Python ->
там.
Теперь, когда .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».