- ironpythonconsole
Bazen IronPython konsolunun başlaması biraz zaman alabilir, çünkü yüklenmesi gereken .NET framework vardır. Konsol başladığında artık Python kodları girmeye hazırsınız. ">>>" karakterleri komut satırınızı ifade eder. İşte örnek bir IronPython oturumu:
C:\>ironpythonconsole IronPython 1.0.2378 (Beta) on .NET 2.0.50727.42 Copyright (c) Microsoft Corporation. All rights reserved. >>> a = 'hello' >>> b = 1 >>> b + 3 4 >>> a.upper() 'HELLO' >>>Bir önceki bölümde verdiğim kod örneği tam olarak klasik bir Python (CPython) sisteminde yapması beklenen işlemleri yapar. Denemek için önceki örneğin kodunu .py uzantısı ile bir dosyaya kaydedin (ben dosyama demo1.py adını verdim). IronPython konsolunda import demo1.py komutunu vererek çalıştırın:
>>> import demo1 10 python is great Sam=80 >>>Fena değil! Fakat burada gerçekten ne olmaktadır? Haydi bunun üzerinde biraz düşünelim: IronPython sonuç olarak C# ile yazılmış büyük bir program. Peki IronPython sadece C#'a port edilmiş bir Python yorumlayıcısı mı? Hayır değil. Eğer durum böyle olsaydı, sadece, .NET hakkında hiçbirşey bilmeyen bir Python yorumlayıcısı çalıştırıyor olurdum. Sadece .NET dilinde yazılmış bir yorumlayıcı. Ama durum böyle değildir.
IronPython, size aynı zamanda Common Language Runtime (CLR) sınıfları yaratma imkanı verir. Başka bir deyişle, IronPython .NET desteği içeren bir Python yorumlayıcısıdır. İlginç.
Pekala, oluşturduğum MyClass sınıfı ile ilgili neler olmaktadır? Bu sadece bir sınıf mıdır, yoksa bir aynı zamanda bir CLR sınıfı mıdır? Öntanımlı olarak sınıf otomatik olarak bir CLR sınıfı olmaz. Ama bunu yapmak oldukça kolaydır. Sadece sınıfı tüm .NET sınıflarının temel sınıfı olan System.Object sınıfından türetmeniz yeterlidir. Bunu yapabilmek için System isimuzayını sisteminize dahil etmeniz gerekir. Konsolunuza yapıştırabileceğiniz örnek kod hemen burada:
import System class MyClass(System.Object): def __init__(self, name, height): self.name = name self.height = height def __str__(self): return "%s=%s"%(self.name, self.height) b = MyClass('Angie', 66) t = b.GetType() print t.FullNameBu kod, önceki sınıf ile aynı özelliklerde bir sınıf yaratır. Fakat sınıfı System.Object nesnesinden türetmiştir. Sınıfı tanımladıktan sonra sınıfın bir örneğini oluşturur ve bunu "b" değişkeninde depolar. Ardından sınıfın GetType metodu çağrılır. Fakat GetType da nedir? Bu System.Object sınıfından kalıtımla gelen bir fonksiyondur ve tüm .NET sınıflarında mevcuttur. Bir .NET sınıfı olan Type tipinde bir nesne döndürür. Bu nesnenin FullName metodunu kullanarak yeni .NET sınıfımın tam adını öğrenebilirim.
Kodun çıktısı şöyle olacaktır:
IronPython.NewTypes.System.Object_1
Aha! MyClass isimli sınıfım sonuçta bir .NET tipi oldu ve IronPython.NetTypes.System adında garip bir isimuzayında yaşıyor. Ama en sondaki Object_1 nedir? Bu .NET içinde varolan yeni veritipimin gerçek adıdır.
Ç.N.: IronPython 1.0.1 sürümüne geldiğinde artık konsol programı ipy.exe olarak adlandırılmıştır.
Çeviri: Zekeriya KOÇ
Reprinted from DevSource.com, a Ziff Davis Media property, all rights reserved, Ziff Davis Media, 28 East 28th St., New York, NY, USA
Birkaç eleştiri:
"Eğer hem Python hem de .NET'e aşinaysanız bazı problemleri hemen farkedebilirsiniz." cümlesinin sonunda "fark etmek" fiili bitişik değil ayrı yazılmalı.
"IronPython konsolunda import demo1.py komutunu vererek çalıştırın:" denmiş ama hemen ardından gelen ekran görüntüsünde sadece "import demo1" yazıyor, .py uzantısı yok. Neden? Hangisi doğru?
"Peki IronPython sadece C#'a port edilmiş bir Python yorumlayıcısı mı?" cümlesi bence biraz problemli. C# ile yazılmış demek ile C#'a 'port edilmiş' demek aynı şey midir? Bir dil başka bir dile 'port' edilebilir mi? 'Port etmek' yerine Türkçe bir tabir kullanabilir miyiz?
"hiçbirşey" yazılmış, "hiçbir şey" olmalı idi.
"Namespace" için "isimuzayı" şeklinde bir bitişik sözcük önermişsiniz. Başka alternatifleriniz de var mıydı? Ya da var mı?
Teknik bir soru: Bir IronPython sınıfı yaratınca eğer istersek ayrıca System.Object'ten miras aldığını belirtmemiz gerekiyor, bunu otomatik yapmanın bir yolu var mı? Yani Common Lisp'tekine benzer bir makro yapısı var mı Python'da? Yani myclassdef BirSinifIsmi... diye bir şey yazıp o BirSinifIsmi isimli sınıfın otomatik olarak System.Object'i atası kabul etmesini sağlayabilir miyim?
"Reprinted from DevSource.com, a Ziff Davis Media property, all rights reserved, Ziff Davis Media, 28 East 28th St., New York, NY, USA" ifadesi de çevrilse olmaz mı?