Jump to content

Python

  • entries
    53
  • comments
    0
  • views
    405

Class Tanımlama


Doğuhan ELMA

62 views

Python'da, bir sınıf (class), belirli özelliklere (attributes) ve metotlara (methods) sahip bir nesne türünü tanımlar. Sınıflar, nesne yönelimli programlamada (OOP) bir temel yapı taşıdır ve benzer nesnelerin bir grup olarak tanımlanmasını ve yönetilmesini sağlar.

Bir sınıf tanımı, class anahtar kelimesi ile başlar ve ardından sınıfın adı gelir. Sınıfın adı genellikle büyük harfle başlar. Sınıfın gövdesi, bir girinti bloğunda tanımlanır ve sınıfın özelliklerini ve metotlarını içerir.

Örneğin, bir Dog sınıfı aşağıdaki gibi tanımlanabilir:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        print("Woof!")

    def birthday(self):
        self.age += 1

Bu Dog sınıfı, name ve age adında iki özelliğe ve bark ve birthday adında iki metoda sahiptir.

__init__ metodu, sınıfın bir örneğini oluştururken çağrılır ve sınıfın başlangıç durumunu ayarlar. Bu metoda genellikle "constructor" (yapıcı) denir. Bu örnekte, __init__ metodu, köpeğin adını ve yaşını ayarlar.

bark metodu, bir eylemi temsil eder. Bu durumda, köpeğin havlamasını temsil eder.

birthday metodu, köpeğin yaşını bir yıl artırır.

Bir sınıfın örneğini oluşturmak için, sınıf adını ve parantezleri kullanırız. Örneğin, fido = Dog("Fido", 3) bir Dog sınıfının örneğini oluşturur ve bu örneği fido değişkenine atar.

Sınıflar, kodun düzenlenmesini ve yönetilmesini kolaylaştırır ve kodun yeniden kullanılabilirliğini artırır. Ayrıca, karmaşık sistemlerin modellemesine yardımcı olur.

 

Python'da, self kelimesi bir sınıfın örneğine (instance) referans vermek için kullanılır. self kelimesi, bir sınıfın metotlarında ilk parametre olarak tanımlanır ve bu metotlar çağrıldığında, Python otomatik olarak self parametresine sınıfın o anki örneğini (instance) geçer.

self kelimesi, bir sınıfın özelliklerine (attributes) ve diğer metotlarına erişmek için kullanılır. Bu, bir sınıfın metotlarının, sınıfın durumunu okumasına ve değiştirmesine olanak sağlar.

Örneğin, bir Dog sınıfı oluşturabiliriz ve self kelimesini kullanarak sınıfın özelliklerine erişebiliriz:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        print(f"{self.name} says: Woof!")

    def birthday(self):
        self.age += 1
        print(f"{self.name} is now {self.age} years old.")

Bu örnekte, __init__, bark, ve birthday metotları, self kelimesini kullanarak name ve age özelliklerine erişir. self kelimesi, bu metotların, Dog sınıfının o anki örneğinin durumunu okumasına ve değiştirmesine olanak sağlar.

self kelimesi, Python'da bir anahtar kelime değildir ve başka bir isimle değiştirilebilir. Ancak, self kelimesinin kullanılması yaygın bir uygulamadır ve Python topluluğu tarafından genellikle kabul edilir.

 

Python'da, "constructor" (yapıcı) bir sınıfın örneğini (instance) oluşturduğumuzda otomatik olarak çağrılan özel bir metottur. Python'da, constructor metodu __init__ olarak adlandırılır.

Constructor, bir sınıfın örneğinin başlangıç durumunu (initial state) ayarlamak için kullanılır. Genellikle, bir sınıfın özelliklerini (attributes) başlangıç değerleri ile ayarlar.

Constructor metodu, self kelimesini ilk parametre olarak alır, bu da sınıfın o anki örneğine referans verir. Constructor ayrıca, başlangıç durumunu ayarlamak için gereken diğer parametreleri de alabilir.

Örneğin, bir Dog sınıfı oluşturabiliriz ve __init__ metodu ile başlangıç durumunu ayarlayabiliriz:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

Bu örnekte, __init__ metodu name ve age parametrelerini alır ve bu parametreleri sınıfın name ve age özelliklerine atar. Bu, Dog sınıfının her örneğinin bir adı ve yaşı olmasını sağlar.

Bir sınıfın örneğini oluşturmak için, sınıf adını ve constructor için gereken parametreleri kullanırız. Örneğin, fido = Dog("Fido", 3) bir Dog sınıfının örneğini oluşturur ve bu örneği fido değişkenine atar.

Constructor metodu, bir sınıfın örneğinin başlangıç durumunu kontrol etmek için önemlidir ve genellikle bir sınıfın özelliklerini ayarlamak için kullanılır.

 

"Nonpublic" terimi, genellikle bir sınıfın özelliklerinin veya metotlarının sınıfın dışından doğrudan erişilemez olduğunu belirtmek için kullanılır. Bu, nesne yönelimli programlamada (OOP) bir sınıfın iç detaylarının gizlenmesi prensibine, yani encapsulation'a yardımcı olur.

Python'da, bir özelliği veya metodu nonpublic yapmanın yaygın bir yolu, isminin başına tek bir alt çizgi (_) koymaktır. Bu, özelliğin veya metodu sınıfın dışından doğrudan erişilemez yapmaz, ancak özelliğin veya metodu sınıfın dışından erişmeye çalışan bir programcıya "bu özellik veya metot sınıfın iç detaylarından biridir ve doğrudan erişilmemelidir" mesajını verir.

Örneğin:

class MyClass:
    def __init__(self):
        self.public_attribute = "I'm public!"
        self._nonpublic_attribute = "I'm nonpublic!"

    def public_method(self):
        return "I'm a public method!"

    def _nonpublic_method(self):
        return "I'm a nonpublic method!"

 

Bu örnekte, _nonpublic_attribute ve _nonpublic_method nonpublic olarak işaretlenmiştir. Bu, bu özelliğin ve metotun sınıfın iç detaylarından olduğunu ve doğrudan erişilmemesi gerektiğini belirtir.

Python'da, bir özelliği veya metodu tamamen private (özel) yapmanın bir yolu da, isminin başına çift alt çizgi (__) koymaktır. Bu, özelliğin veya metodu sınıfın dışından doğrudan erişilemez yapar. Ancak, bu genellikle sadece özelliğin veya metotun yanlışlıkla üzerine yazılmasını önlemek için kullanılır ve genellikle sadece özelliğin veya metotun sınıfın iç detaylarından biri olduğunu belirtmek için tek alt çizgi kullanılır.

 

Sınıf veri üyeleri (Class Data Members), bir sınıfın içinde tanımlanan değişkenlerdir. Bu değişkenler, sınıfın tüm örnekleri (instances) tarafından paylaşılır ve erişilebilir. Sınıf veri üyeleri genellikle sınıfın durumunu saklamak için kullanılır.

Python'da, sınıf veri üyeleri sınıf tanımının içinde, ancak herhangi bir metot dışında tanımlanır. İşte bir örnek:

class MyClass:
    class_data_member = "This is a class data member"

# Accessing the class data member
print(MyClass.class_data_member)  # Outputs: This is a class data member

Bu örnekte, class_data_member bir sınıf veri üyesidir ve MyClass sınıfının tüm örnekleri tarafından paylaşılır.

Sınıf veri üyeleri, sınıfın tüm örnekleri arasında paylaşılan bilgileri saklamak için kullanılır. Örneğin, bir Dog sınıfınız varsa ve tüm köpeklerin aynı türde olduğunu belirtmek istiyorsanız, bu bilgiyi bir sınıf veri üyesinde saklayabilirsiniz.

Ancak, her örneğin kendi durumunu saklaması gerekiyorsa, bu durumda örnek veri üyeleri (instance data members) kullanılır. Bu değişkenler, self anahtar kelimesi ile birlikte tanımlanır ve her örneğin kendi kopyasına sahip olur. Örneğin, her köpeğin kendi adı ve yaşı olacağı için, bu bilgileri örnek veri üyelerinde saklarsınız.

 

Nested class, bir sınıfın içinde tanımlanan başka bir sınıftır. Bu, bir sınıfın başka bir sınıfın özellikleri ve davranışlarına yakından bağlı olduğu durumlarda kullanılır. İçteki sınıf, dıştaki sınıfın kapsamında tanımlanır ve genellikle dıştaki sınıf ile yakından ilişkilidir.

Python'da, bir sınıfı başka bir sınıfın içinde tanımlamak oldukça basittir:

class OuterClass:
    class NestedClass:
        pass

Bu örnekte, NestedClass adlı bir sınıf, OuterClass adlı başka bir sınıfın içinde tanımlanmıştır.

Nested class'lar genellikle iki durumda kullanılır:

Nested class, dıştaki sınıf tarafından kullanılıyor, ancak başka hiçbir yerde kullanılmıyor. Bu durumda, nested class'ı dıştaki sınıfın içinde tanımlamak kodu daha düzenli ve anlaşılır hale getirir.

Nested class, dıştaki sınıfın iç durumunu veya davranışını temsil ediyor. Bu durumda, nested class'ı dıştaki sınıfın içinde tanımlamak, bu iki sınıf arasındaki yakın ilişkiyi belirtir.

Ancak, nested class'lar her zaman en iyi çözüm değildir. Eğer nested class, dıştaki sınıfın dışında başka yerlerde de kullanılacaksa, genellikle daha iyi bir seçenek olacaktır. Ayrıca, nested class'lar kodu karmaşıklaştırabilir ve anlaşılması zor hale getirebilir, bu yüzden dikkatli kullanılmalıdırlar.

 

Python'da, bir sınıfın örnekleri genellikle iç durumlarını bir sözlük (dictionary) içinde saklar. Bu sözlük, örneğin özelliklerini (attribute) ve metotlarını içerir. Bu, Python'un dinamik doğasını sağlar - yani, bir örneğin özelliklerini herhangi bir zamanda ekleyebilir veya çıkarabilirsiniz. Ancak, bu esneklik bazen bellek kullanımı ve performans açısından maliyetli olabilir.

Python'da, __slots__ deklarasyonu, bir sınıfın özelliklerini saklamak için kullanılan sözlüğü kaldırır. Bunun yerine, her örneğin belirli bir set özelliklere sahip olacağını belirtir. Bu, bellek kullanımını azaltır ve performansı artırır, ancak örneğin özelliklerini dinamik olarak eklemeyi veya çıkarmayı engeller.

__slots__ deklarasyonu, bir sınıf tanımının içinde bir __slots__ özellik tanımlayarak yapılır. Bu özellik, bir dize dizisi olmalı ve her dize, sınıfın bir özelliğinin adını temsil etmelidir.

İşte bir örnek:

class MyClass:
    __slots__ = ['name', 'age']

    def __init__(self, name, age):
        self.name = name
        self.age = age

Bu örnekte, MyClass sınıfının her örneği yalnızca name ve age özelliklerine sahip olabilir. Bu özellikler dışında başka bir özellik eklemeye çalışmak bir hata oluşturur.

__slots__ deklarasyonu, özellikle bir sınıfın çok sayıda örneği olduğunda ve bu örneklerin yalnızca belirli bir set özelliklere sahip olması gerektiğinde kullanışlıdır. Ancak, __slots__ deklarasyonu esnekliği azaltır ve dikkatli kullanılmalıdır. Özellikle, bir sınıfın alt sınıflarının farklı özelliklere sahip olması gerekiyorsa, __slots__ deklarasyonu genellikle uygun olmayacaktır.

 

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...