oop etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
oop etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

22 Şubat 2009 Pazar

Listenin kopyasını almak

Python da her eşitlik referans gösterir. Bu iddalı lafın anlamını şöyle ifade edeyim.
Örneğin şekildeki gibi bir liste = başka bir liste şeklinde kopya almaya çalıştığınızda şöyle bir gariplik (aslında güzellik) ile karşılaşırsınız.

>>> a = ["a","b","c"]
>>> b = a
>>> b.append("d")
>>> print a, b
['a', 'b', 'c', 'd'] ['a', 'b', 'c', 'd']


Nesnelere gelince yine aynı mantık, nesne = başkabirnesne dediğinizde referans göstermiş oluyorsrunuz :


>>> class obj:
... def __init__(self):
... self.counter = 0
... def inc(self):
... self.counter += 1
...
>>> a = obj()
>>> b = a
>>> a.inc()
>>> print a.counter
1
>>> print b.counter
1


Bir nesnenin ya da değişkenin kopyasını almak istediğinizde çeşitli yöntemler var, sanırım verilerin (list, tuple, dict vs) kopyasını alırken karşılaştığım en yakışıklı yöntem şu :

>>> a = ["a","b","c"]
>>> b = list(a)
>>> print a , b
['a', 'b', 'c'] ['a', 'b', 'c']
>>> a.append("d")
>>> print a, b
['a', 'b', 'c', 'd'] ['a', 'b', 'c']


Peki bir nesnenin kopyasını almak istiyorsak? bunun için copy adında bir modül yapmışlar :

>>> class obj:
... def __init__(self):
... self.counter = 0
... def inc(self):
... self.counter += 1
...
>>> a = obj()
>>> from copy import copy
>>> b = copy(a)
>>> a.inc()
>>> b.inc()
>>> b.inc()
>>> b.inc()
>>> print a.counter, b.counter
1 3
Eğer copy modülünden deepcopy fonksionunu import eder kullanırsak, nesneyi özyinelemeli olarak kopyalıyormuş. Herkese iyi hafta sonları

18 Ağustos 2008 Pazartesi

Uml Modelleme - 1

Uml (unified modelling language) karmaşık bir sistemin elemanlarını , değişkenlerini çalışma prensipleri gibi bilgileri grafiksel şemalar ile ifade etmemize yarar. Uml sayesinde bir satır kod yazmadan bütün programın nasıl çalışacağını şema üzerinde görebilir, açıklarını-ihtiyaçlarını tespit edebiliriz. Tahmin edebilirsiniz ki bütün sistemi daha en başından basit bir şekilde modellemek sistemin açıklarını baştan görmek inanılmaz büyük bir avantaj.

Başka bir konu da anlaşılabilirlik... projenize dışardan biri katıldığı zaman birkaç saat içerisinde sizin projenizin bütün çalışma prensibini anlayabilir geriye ayrıntılar kalır.

Buradaki bahsi geçen sistem çok geniş bir kavramdır, vücudun çalışması, karayolu trafiği , yazdığımız program... herşey bu uml ile modellenebilir. Bu noktada uml: sınıf diagramı ,bileşen diagramı, birleşik yapı diyagramı gibi çeşitlere ayrılır. Biz bu yazımızda sınıf diagramları ile ilgileneceğiz.

Sınıf diagramı wikipedia da şu cümleyle açıklanmış : "Sınıf Diyagramı ("Class Diagram") vasıtası ile Nesnel Yönelimli Programlamada temel teşkil eden sınıflar net şekilde gösterilebilir ve böylece sağlanan ek görsellik ile yazılım tasarlamanın ilerleyen aşamalarında daha yüksek verimlilik sağlanabilir."

Buraya kadar herşey tamam. Peki bir uml şeması neye benzer diyecek olursanız ?? Aşağıdaki örneği verebiliriz


Şimdilik bu kadarı tanışma için yeterli sanırım. Bir daha ki yazıda burada gördüğümüz şekillerin anlamlarından bahsedeceğim.

14 Ağustos 2008 Perşembe

Pyton ve Nesnel Programlama

Nesnel programlama sizin programınızı gerçek dünyadaki sistemler gibi modelleyebilmenizi sağlayan bir güzelliktir , kim icat ettiyse elleri öpülesi mukaddes bir insandır.

  • Nesnel yaklaşımda bir sınıf yaratılır, sınıf bir genellemedir. Belli bir grup nesnenin ortak özelliklerini barındırır(örn: organism sınıfı bütün organizmalarda bulunan işlem ve özellikleri barındırır.)

  • Nesne bu sınıf'ın bir nesneye uygulanmasıdır animal = organism() yada human = organism() dediğimiz zaman buradaki animal ve human birer nesnedir.

  • Sınıf özellikleri bu sınıfa ait özelliklerdir. Örneğin her organizmanın bir yaşı vardır. Bu yaş bigisini organism sınıfı üzerinde age olarak tanımlarsak [1] daha sonra bu sınıfa ait nesnelerin age özelliğini animal.age şeklinde çağırabiliriz.

  • Bir sınıf kendi özelliklerini kendi kendine de değiştirebilir. Bu durumda self.ozellik = hede şeklinde kullanılır. Buradaki aslında self sınıfın kendisini ifade eder. Eğer bir fonksiyon içerisinde self. kullanılacaksa o fonksiyonun argümanı içerisinde self bulumalıdır.[2]

  • Bir nesne oluşturuluyorken __init__ fonksiyonu otomatik olarak çağırılır.

  • Bir nesne siliniyorken __del__ fonksiyonu otomatik olarak çağırılır. Eğer del(nesne) kullanılarak nesne silinmez ise nesne program sonunda silinir.


  • __init__ ve __del__ fonksiyonları self argümanı ile belirtilmek zorundadır.

  • örnek olarak bir organizma sınıfı şu şekilde tanımlanabilir.
    class organism:
    def __init__(self):
    print "ben doğdum"
    self.age = 0 [1]
    def grow_up(self,years):
    self.age += years
    def __del__(self):
    print "ben öldüm"
    animal = organism()
    print "animal age is :",animal.age
    animal.grow_up(3) # grow up 3 years
    print "animal age is :", animal.age