Python First-Class Everything Nedir?

Abdullah ÇALIŞKAN
2 min readJul 10, 2018

--

Python programlama dilinin yazarı Guido van Rossum, Python dilini geliştirirken hedeflerinden birisinin dil içindeki tüm nesnelerin “birinci sınıf” olmasını sağlamak olduğunu söylemiştir. Yani Python’da tüm nesneler eşit davranışlara sahiptir. Tüm nesneler, bir değişkene atanabilir, başka bir nesne içinde saklanabilir, argüman olarak gönderilebilir, dönüş değeri olabilir vb.

Python’ın iç yapısı bu işlemlerin yapılmasını kolay kılıyor. Çünkü Python yorumlayıcısında kullanılan nesneler ortak bir C struct’ına dayanıyor.

class Kisi:
def __init__(self, name):
self.name = name

def introduce(self):
return “Selam, ben “ + self.name

“First-class everything” konseptinin bazı zorlukları bulunmaktadır. Örneğin; bir sınıf (Kisi) altındaki örnek metodunun (introduce) ilk parametresi (self), metodu çağıran nesneyi işaret etmektedir. First-class everything konsepti ile her şeyi bir başka değişkene atayabilirsiniz. Peki biz sınıf içindeki metodu nasıl değişkene atarız? Değişkene atadığımız zaman, nesneyi işaret eden ilk parametreye ne olacak?

Bağsız & Bağlı Metotlar (Unbound & Bound Methods)

Python’da sınıflara ait metotlar ile fonksiyonları ayırmak için çağrılabilir unbound method ve bound method nesneleri oluşturulmuştur. Aslında bu nesneler birer wrapper’dır. Bound metodu, wrapper sayesinde asıl metodu çalıştırırken metodun ilk parametresine nesneyi geçirir. Bu sayede, sınıflar içerisindeki metotları değişkenlere atayabilirsiniz; liste, sözlük gibi nesnelerde saklayabilirsiniz.

Yukarıdaki Kisi sınıfını inceleyelim; Eğer ki siz introduce metodunu işletmek istiyorsanız yapmanız gereken ilk şey Kisi sınıfından bir nesne oluşturmak.

abdullah = Kisi(“abdullah”)
bound_metot = abdullah.introduce

abdullah.introduce() metodunu bu şekilde çalıştırmak yerine, bound_metot() şeklinde çalıştırabilirsiniz. Bu bize ne kazandırdı? diye soracak olursanız; First-class everything konseptini sağlamış oluyorsunuz. Bu sayede nesneleri rahatlıkla saklayabiliyorsunuz, geri dönüş değeri yapabiliyorsunuz.
Bu konudan sonra Python decorator konusuna bakmanızı öneririm ki, ilerleyen zamanlarda decoratorler ile ilgili bir yazı daha paylaşmayı düşünüyorum.

Konumuza dönecek olursak, bound_metot kullanımını gördük.

“type(bound_metot)” dersek, çıktı olarak “<bound method at …>” şeklinde bir çıktı alırız. Ancak unbound_metot biraz daha farklı, unbound bir metot oluşturmak ve kullanmak için;

unbound_metot = A.introduceunbound_metot(abdullah)

şeklinde kullanabiliriz. Aslında burada yaptığımız şey, self parametresini dışarıdan sağlamak. Çünkü bu metot ki aslında burada fonksiyon, parametre olarak bir nesne beklemektedir.
Unbound metotlar Python2 ve Python3'te biraz değişiklik gördüler. “type(unbound_metot)” satırının çıktısı;
Python2'de “<unbound method at …>” şeklinde iken,
Python3'te “<function at …>” şeklindedir.
Python geliştiricileri, unbound metot ile fonksiyon arasında bir fark olmadığı için unbound metotlara Python3'te fonksiyon olarak nitelendirmeye karar vermişlerdir.

NOT: Decoratorler hakkında yayınlayacağım yazıda, bu konuya ait bir kaç açıklayıcı örnek daha olacaktır.

Yazıda bir hata yakaladıysanız, lütfen caliskanabdullah@yahoo.com adresine mail atınız.
Teşekkürler.

--

--