Python’da Nesneler ve Sınıflar
Bu öğreticide, Python nesnelerinin ve sınıflarının temel işlevleri hakkında bilgi edineceksiniz. Bir sınıfın ne olduğunu, nasıl oluşturulacağını ve programınızda nasıl kullanılacağını öğreneceksiniz.
Python Nesneleri ve Sınıfları
Python, nesne yönelimli bir programlama dilidir. Ana vurgunun işlevler üzerinde olduğu prosedür yönelimli programlamanın aksine, nesne yönelimli programlama nesneler üzerinde durur.
Bir nesne, basitçe, bu veriler üzerinde hareket eden bir veri (değişkenler) ve yöntemler (fonksiyonlar) topluluğudur. Benzer şekilde, bir sınıf o nesne için bir plandır.
Sınıfı bir evin taslağı (prototipi) olarak düşünebiliriz. Zeminler, kapılar, pencereler vb. ile ilgili tüm detayları içerir. Bu açıklamalara göre evi inşa ediyoruz. Ev nesnedir.
Bir evin planından birçok ev yapılabildiği gibi, bir sınıftan da birçok nesne oluşturabiliriz. Bir nesneye aynı zamanda bir sınıfın örneği de denir ve bu nesneyi yaratma sürecine örnekleme denir .
Python’da Sınıf Tanımlamak
Python’da fonksiyon tanımlarının def anahtar sözcüğüyle başlaması gibi, sınıf tanımları da bir sınıf anahtar sözcüğüyle başlar.
Sınıf içindeki ilk dizgeye docstring denir ve sınıfın kısa bir açıklaması vardır. Zorunlu olmamakla birlikte, bu şiddetle tavsiye edilir.
İşte basit bir sınıf tanımı.
1 2 3 | class MyNewClass: '''This is a docstring. I have created a new class''' pass |
Bir sınıf, tüm niteliklerinin tanımlandığı yeni bir yerel ad alanı oluşturur. Nitelikler veri veya işlevler olabilir.
Ayrıca çift alt çizgi ile başlayan özel nitelikler de vardır __
. Örneğin, __doc__
bize o sınıfın belge dizisini verir.
Bir sınıf tanımladığımız anda aynı isimde yeni bir sınıf nesnesi oluşturulur. Bu sınıf nesnesi, farklı niteliklere erişmemize ve o sınıfın yeni nesnelerini başlatmamıza izin verir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Person: "This is a person class" age = 10 def greet(self): print('Hello') # Output: 10 print(Person.age) # Output: <function Person.greet> print(Person.greet) # Output: "This is a person class" print(Person.__doc__) |
Çıktı
1 2 3 | <samp>10 <function Person.greet at 0x7fc78c6e8160> Bu bir kişi sınıfıdır</samp> |
Python’da Nesne Yaratmak
Sınıf nesnesinin farklı niteliklere erişmek için kullanılabileceğini gördük.
O sınıfın yeni nesne örneklerini (örneklerini) oluşturmak için de kullanılabilir. Bir nesne oluşturma prosedürü, bir işlev çağrısına benzer.
1 | >>> harry = Person() |
Bu, adında yeni bir nesne örneği yaratacaktır.harry. Nesne adı önekini kullanarak nesnelerin niteliklerine erişebiliriz.
Nitelikler veri veya yöntem olabilir. Bir nesnenin yöntemleri, o sınıfın karşılık gelen işlevleridir.
Bu Person.greet
, bir işlev nesnesi (sınıfın niteliği) olduğundan, Person.greet
bir yöntem nesnesi olacağı anlamına gelir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Person: "This is a person class" age = 10 def greet(self): print('Hello') # create a new object of Person class harry = Person() # Output: <function Person.greet> print(Person.greet) # Output: <bound method Person.greet of <__main__.Person object>> print(harry.greet) # Calling object's greet() method # Output: Hello harry.greet() |
Çıktı
1 2 3 | <samp><function Person.greet at 0x7fd288e4e160> <bağlı yöntem Person.greet of <__main__.Person nesnesi 0x7fd288e9fa30>> Merhaba</samp> |
self
Parametreyi sınıf içindeki fonksiyon tanımında fark etmiş olabilirsiniz ama biz metodu herhangi bir argümanharry.greet()
olmadan basitçe çağırdık . Hala işe yaradı.
Bunun nedeni, bir nesne yöntemini çağırdığında, nesnenin kendisinin ilk argüman olarak iletilmesidir. Yani harry.greet()
çevirir Person.greet(harry)
.
Genel olarak, n bağımsız değişken listesiyle bir yöntemi çağırmak, yöntemin nesnesini ilk bağımsız değişkenden önce ekleyerek oluşturulan bir bağımsız değişken listesiyle karşılık gelen işlevi çağırmaya eşdeğerdir.
Bu nedenlerden dolayı, işlevin sınıftaki ilk argümanı nesnenin kendisi olmalıdır. Buna geleneksel olarak deniröz. Başka bir şekilde adlandırılabilir, ancak sözleşmeyi takip etmenizi şiddetle tavsiye ederiz.
Şimdi sınıf nesnesi, örnek nesnesi, işlev nesnesi, yöntem nesnesi ve bunların farklılıklarına aşina olmalısınız.
Python’da yapıcılar
Çift alt çizgi ile başlayan sınıf işlevlerine __
özel anlamları olduğu için özel işlevler denir.
Özel bir ilgi alanı, __init__()
işlevdir. Bu özel işlev, o sınıfın yeni bir nesnesi başlatıldığında çağrılır.
Bu tür işlevlere Nesne Yönelimli Programlama’da (OOP) yapıcılar da denir. Normalde tüm değişkenleri başlatmak için kullanırız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class ComplexNumber: def __init__(self, r=0, i=0): self.real = r self.imag = i def get_data(self): print(f'{self.real}+{self.imag}j') # Create a new ComplexNumber object num1 = ComplexNumber(2, 3) # Call get_data() method # Output: 2+3j num1.get_data() # Create another ComplexNumber object # and create a new attribute 'attr' num2 = ComplexNumber(5) num2.attr = 10 # Output: (5, 0, 10) print((num2.real, num2.imag, num2.attr)) # but c1 object doesn't have attribute 'attr' # AttributeError: 'ComplexNumber' object has no attribute 'attr' print(num1.attr) |
Çıktı
1 2 3 4 5 6 | <samp>2+3j (5, 0, 10) Geri izleme (en son arama son): Dosya "<string>", satır 27, <module> içinde yazdır(sayı1.attr) AttributeError: 'ComplexNumber' nesnesinin 'attr' özelliği yok</samp> |
Yukarıdaki örnekte, karmaşık sayıları temsil edecek yeni bir sınıf tanımladık. __init__()
Değişkenleri başlatmak (varsayılanı sıfırdır) ve get_data()
sayıyı düzgün görüntülemek için iki işlevi vardır .
Yukarıdaki adımda dikkat edilmesi gereken ilginç bir nokta, bir nesnenin niteliklerinin anında oluşturulabilmesidir. Yeni bir özellik oluşturdukattrnesne içinsayı2ve onu da okuyun. Ancak bu, nesne için bu özelliği oluşturmaz.num1.
Nitelikleri ve Nesneleri Silme
Bir nesnenin herhangi bir niteliği, ifade kullanılarak herhangi bir zamanda silinebilir del
. Çıktıyı görmek için Python kabuğunda aşağıdakileri deneyin.
1 2 3 4 5 6 7 8 9 10 11 12 | >>> num1 = ComplexNumber(2,3) >>> del num1.imag >>> num1.get_data() Traceback (most recent call last): ... AttributeError: 'ComplexNumber' object has no attribute 'imag' >>> del ComplexNumber.get_data >>> num1.get_data() Traceback (most recent call last): ... AttributeError: 'ComplexNumber' object has no attribute 'get_data' |
Del ifadesini kullanarak nesnenin kendisini bile silebiliriz.
1 2 3 4 5 6 | >>> c1 = ComplexNumber(1,3) >>> del c1 >>> c1 Traceback (most recent call last): ... NameError: name 'c1' is not defined |
Aslında, bundan daha karmaşık. Bunu yaptığımızda c1 = ComplexNumber(1,3)
, bellekte yeni bir örnek nesne oluşturulur ve adıc1onunla bağlanır.
Komutta del c1
bu bağlama kaldırılır ve adc1karşılık gelen ad alanından silinir. Ancak nesne bellekte varlığını sürdürür ve kendisine başka bir ad bağlı değilse, daha sonra otomatik olarak yok edilir.
Python’da referanssız nesnelerin bu otomatik imhasına çöp toplama da denir.
