Kayıt Ol

Giriş


Şifremi Kaybettim

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

soru ekleme

Soru sormak için giriş yapmalısınız.

Giriş


Kayıt Ol

Merhaba, kayıt formu üzerinden kayıt olabilirsiniz. Fakat sosyal medya ile kayıt olmanızı önermekteyiz.

Python Sınıflarında Bazı Yerleşik Metodlar

Python Sınıflarında Bazı Yerleşik Metodlar

Python Sınıflarında Bazı Yerleşik Metodlar

Gereksinimler

  • Python 3 Bilgisi: Bu yazı özellikle Python 3 için hazırlandı. Python 2’de değişiklikler olabilir.

Nesne yönelimli programlama gerçek dünya sorunlarını çözmemiz için önemli bir yere sahip olan yöntemdir. Python, nesne yönelime zorlamayan bir dil, ancak olgun (stable) bir yazılım geliştirmek için nesne yönelimi kullanmak şarttır. Aynı zamanda Python, oluşturulan sınıfların içerisinde bazı yerleşik metodlar barındırır. Bu metodları kimi zaman bilmeden kullanıyoruz. Bilmediklerimiz ise bizim hayatımızı kolaylaştırabiliyor. Başlamadan önce örnek bir sınıf oluşturalım:

Şimdi ise metodlarımıza geçelim.

Temel Bazı Metodlar

__init__(self, *args, **kwargs)

Bu metodu aslında fazlasıyla kullanıyoruz. Sınıfımızın örneklerini oluşturmak (nesneleri) için bu metodu kullanırız. Örneğin sınıfımızda color ve zth argümanları __init__ içerisinde kullanıldığında değerlerini alacaklar ve nesnemiz oluşmuş olacak.

__str__(self, *args, **kwargs)

Bir sınıfı str() metodu içerisinde çağırmayı hiç denediniz mi? Şöyle bir şey elde edersiniz:

Özellikle nesneleri liste ve benzeri bir şeyin içerisine eklediğimiz zaman bunları ayırt etmek önem taşır. __str__ metodu iyi bir çözüm. Sınıfımıza şöyle bir metod ekleyelim:

Şimdi ise şunları deneyerek sonuçları görelim:

Gördüğümüz üzere label değeri olmayan nesnemiz standard bir çıktı verirken label var ise onu döndürüyoruz. Bir liste içerisinde yüzlerce olabileceğini varsayarsak bunları kolayca ayırabiliriz.

Şimdilik super() metodunun ne işe yaradığına dair bir şey bilmenize gerek yok. Başka bir yazının konusu olabilir.

__str__ metodu her zaman str türünde bir veri döndürmelidir. Aksi takdirde TypeError alırsınız.

__call__(self, *args, **kwargs)

Bu metodla nesnelerinizi bir metod gibi çağırabilirsiniz. Kullanılması gereken bazı özel durumlar olabilir. Örneğin 0-100’ü belirli bir süre alan aracımızın kaç saniyede belirli bir kilometreye ulaşacağını hesaplayabileceğimiz bir metod oluşturalım:

Şimdi bunu deneyelim:

python sinif metodlari

Gördüğünüz üzere 5 saniyede belirtilen kilometreye çıkabiliyor.

Ancak bunun için __call__ kullanmaya gerek yok. Farklı, özel bir metod işimizi görür. Bunu sadece örnek olarak alabilirsiniz.

Tabi bu mantık kısmen yanlış bir mantık. Bir aracın ulaşabileceği maksimum bir hız vardır. Biz burada resmen aracımızın sonsuz bir hıza ulaşabileceğini varsaydık.

Mantıksal Operatör Metodları

Mantıksal operatörler <><=>===andor gibi iki nesnenin karşılaştırılması sonucu True ya da False değer döndüren operatörlerdir. Sınıflarımızda bunlara özel metodları oluşturarak nesneler arası karşılaştırmayı çok daha kolay hale getirebiliriz. Ancak bunlar çok nadir durumlarda kullanılmalıdır. Normalde zaten nesne1 == nesne2 şeklinde bir karşılaştırma yapabiliyoruz. Bunları kullandığımızda bu işlemleri bir nevi manipüle ediyor olacağız.

Bu metodların ortak özellikleri True ya da False döndürme zorunlulukları (yoksa TypeError alırsınız) ve argüman olarak sadece other almaları. Ayrıca bu metodlarda araçlarımızın 0-100 hızını karşılaştıracağız.

__eq__(self, other)

İki nesnenin eşit olup olmadığını anlamak için kullanabiliriz. Eğer araçlarımızın 0-100’ü eşitse, eşitlerdir.

Şimdi de test edelim:

Gördüğünüz gibi karşılaştırmada sadece zth değişkenini kullandık. Ayrıca fark edersiniz ki a == c, renkler farklı olmasına rağmen True döndürdü.

Diğer operatörleri de benzer metodlarla yapabileceğiniz için onları teker teker girmeyeceğim, şöyle bir liste var:

  • __ne__: a != b
  • __lt__: a < b
  • __gt__: a > b
  • __le__: a <= b
  • __ge__: a >= b
  • __and__: a and b
  • __or__: a or b

Ayrıca unutmayın, araç mantığında 0-100’ü küçük olan araç diğerinden büyük olacaktır, çünkü daha hızlıdır.

Sayısal Operatör Metodları

Sayısal operatörler +*/% gibi operatörlerdir. Bunlar için de özel metodlar bulunmaktadır ve bunlar da mantıksal operatörlerdeki gibi other argümanı alır. Ancak örneğimize uygun bir yöntem olmadığı için aşağıya liste halinde bunları veriyorum:

  • __add__: nesne1 + nesne2
  • __sub__: nesne1 – nesne2
  • __mul__: nesne1 * nesne2
  • __div__: nesne1 / nesne2
  • __mod__: nesne1 % nesne2
  • __pow__: nesne1**nesne2

Koleksiyon Metodları

Koleksiyonlar genelde içlerinde birden fazla nesne barındıran türler olarak adlandırılabilir. Bu başka bir yazının konusu, ama kısaca dictsetlisttuple birer koleksiyon türleridir. Yine örneğimizle bir alakası olmadığı için bunları başka kısa örneklerle vereceğim.

__len__(self)

Bir nesneye len() ile yaklaştığımızda vermesi gereken sonuçtur. Her zaman int döndürmelidir, yoksa TypeError verir. Bunu nesnenizin içerisinde sayılması gereken birden fazla koleksiyon olduğunda veya farklı bir değer döndürmesini istediğimizde kullanabiliriz. Buna Vehicle örneğimizle yaklaşabiliriz. Aracımızın teker sayısını döndürmesini sağlayalım:

Şimdi de test edelim:

Gördüğünüz üzere işe yarıyor.

__getitem__(self, key), __setitem__(self, key, value) ve __delitem__(self, key)

Bu metodlarımız ortak bir amaç güdüyor. Nesnemizi tıpkı bir dict gibi işlememize yarıyor. Vehicle örneği buna pek uygun değil, bu sebeple yalnızca aşağıdaki örneği verebileceğim:

__iter__(self)

Bu metodumuz iterator türünde bir değer döndürmek zorundadır, yoksa ne hata vereceğini biliyorsunuz. Nesnemizi tıpkı bir koleksiyon gibi işlememizi sağlar. Böylece nesnemizi bir döngü (forwhile gibi) içerisinde kolayca kullanabiliriz. Buna da Vehicle‘dan bir örnek veremeyeceğim. Aşağıdaki örneği ele alabilirsiniz:


Evet, Python sınıflarında bazı ve en çok işe yarayabilecek yerleşik metodlar bu şekildeydi. Eğer daha fazlasını öğrenmek istiyorsanız Rafe Kettler’ın yerleşik metodlarla ilgili yazısına bakabilirsiniz.

Hakkında Erdin ErayÇırak

Dilbilim öğrencisi, programlamaya meraklı, INTJ kişilik. Genelde web geliştirmeyle ilgilensem de kendi alanım sebebiyle doğal dil işleme ve bilgisayar dilbilimle de yakından ilgiliyim.

Beni Takip Et

Leave a reply

Captcha Captcha güncellemek için resime tıkla