22 Ağustos 2013 Perşembe

Python'da Sınıflar ve Miras Alma

 Nesne tabanlı programlama denildiğinde akla gelen ilk şey sınıflardır. Sınıf dediğimiz kavram fonksiyonlara benzer. Fonksiyonlarda nasıl veri tipleri ve değişkenleri tekrar kullanmak için bir yerde toplayabiliyorsak, yazdığımız sınıflarda da nesnenin özelliklerini toplayabiliyoruz.

Sınıflarla ilgili birkaç kavramdan bahsedeyim.

-Sınıf Değişkeni:  Bir sınıfın tüm örnekleri tarafından paylaşılan değişkendir. Sınıf değişkenleri sınıf içinde tanımlanır fakat dışında sınıf metodudur.

-Fonksiyonu Aşırı Yükleme: Belirli bir işleve birden fazla davranış atamak.

-Operatör aşırı yükleme: Belirli bir operatör için birden fazla fonksiyon atamak.

-Miras Alma: Bir sınıftan türetilen diğer sınıflar için, o sınıfın özelliklerinin devri anlamındadır. 

Sınıf Oluşturma:

"class className: " şeklinde oluşturulur. Aşağıdaki kod parçasını deneme.py dosyasına yazalım.


class Employee: 
    empCount = 0
     
    def __init__(self, name, salary): 
       self.name = name  
       self.salary = salary 
       Employee.empCount += 1 
    def displayCount(self): 
       print "Total Employee %d" % Employee.empCount  
    def displayEmployee(self): 
       print "Name : ", self.name, ",Salary: ", self.salary

nesnelerini oluştururken Python'u çalıştırıp önce "from deneme import Employee" diyerek sınıftaki özellikleri kullanılabilir hale getiriyoruz.

emp1 = Employee("aybuke", "5000")

diyerek de nesnemizi oluşturabiliriz.

Bazı niteliklere erişmek için de aşağıdaki fonksiyonlar kulanılanılabilir:
- getattr(obj, name, [default]): nesne niteliğine erişmek için.
-hasattr(obj, name): niteliğin olup olmadığını kontrol etmek için.
-setattr(obj, name, value): nitelik ayarlamak için. Yoksa niteliği oluşturacaktır.
-delattr(obj, name): niteliği silmek için.

Dahili Sınıf Özellikleri: 

Nokta operatörü ile sınıf özelliklerine rahatça erişilir.

__dict__ : İsimuzaylarının bulunduğu sözlük.

__doc__: sınıf belgeleri tanımlandıysa buradadır.

__name__: sınıf adını bulundurur.

__module__: sınıfın tanımladığı modül adı. Etkileşimli modda __main__'dir.

__bases__:  Temel sınıf listesinde oluşma sırasına göre temel sınıfları barındıran, bir olasılıkla boş taban sınıfları. 

Miras Alma:

önce miras alınacak sınıfımızı oluşturalım.

class Animal(object): 
''' Our animal object '''
     def __init__(self,name,animalType): 
        print "I am a ",animalType 
    def makeNoise(self,noise): 
        print noise def sleep(self): 
        print "zzzz" 
    def eat(self,food): 
        print "Eating ",food

daha sonra alt sınıfımızı yazalım.

class Tiger(Animal):
    def __init__(self, name):
        super(Tiger, self).__init__(name, Tiger)
        self.makenoise('roar')
    def stalk(self):
        print 'talking an antelope'
        self.eat('anthelope meat')
yukarıda kullandığımız  "super" methodunun işlevi de şu aslında:

class A(object):
    
     def __init__(self):
     print ('running A .__init__')

class B(A):
     
     def __init__(self):
     print('running B.__init__')
     A.__init__(self)
     #super(B,self).__init__()

Sonraki yazımda görüşmek üzere..

2 yorum:

  1. Super methodunu tam olarak açıklar mısınız

    YanıtlaSil
  2. Alt-sınıf, üst-sınıfına erişmek isterse bu methodu kullanabiliyoruz. Nesne yaratırken, bir de üst-sınıfın öğelerine erişirken işe yarıyor. Mesela yukarda A sınıfı B'nin üst sınıfı. B sınıfı, A'nın methoduna erişip kullanabilmiş, "super(B,self).__init__()" bu şekilde. Ben B sınıfınd uzun halini yazıp methodu kullandığım satırı yorum satırı şeklinde yazmışım. Karışıklık yaratmış da olabilir. Kısaca A sınıfındaki methodu yeniden B sınıfına yazmaktansa A'dakine erişip kullanabiliriz.

    YanıtlaSil