Out[1]: True
Out[2]: True
Out[3]: False
Python bir nesne yönelimli programlama dilidir. Python’daki hemen hemen her şey, öznitelikleri ve yordamları ile bir nesnedir.
Python sınıfları, Nesne Yönelimli Programlamanın tüm standart özelliklerini sağlar: sınıf örneklem mekanizması, birden fazla temel sınıfa izin verir, türetilmiş bir sınıf, temel sınıfının veya sınıflarının herhangi bir yordamını geçersiz kılabilir ve bir yordam, aynı ada sahip bir taban sınıfının yordamını çağırabilir . Nesneler, rastgele miktarları ve veri türlerini içerebilir. Modüller için doğru olduğu gibi, sınıflar Python’un dinamik doğasını paylaşırlar: çalışma zamanında oluşturulurlar ve oluşturulduktan sonra daha fazla değiştirilebilirler.
Burada, (class docstring) class_name.doc üzerinden erişilebilen bir belge dizesidir ve class_suite, temel olarak sınıf elemanlarını, veri özniteliklerini ve yordamları tanımlayan tüm bileşen ifadelerinden oluşur.
Out[1]:
x adlı bir özdeğere sahip MyClass adlı bir sınıf/öbek oluşturun:
Sınıf: Uzakta bir kale duruyor. Birçok işlevi vardır - bir hendek vardır, duvarları vardır, şehri korur. İstilacıları dışarıda tutar.
Bir kale gibi: Python’daki bir sınıfın işlevleri vardır (defs). Bir kale kasabayı koruyor. Bir sınıf verilerini korur. Sınıflar bir soyutlamadır.
Out[1]:
Sınıf oluşturulduktan çok sonra ve sonradan eşleştirildikten sonra bile bir sınıf özniteliğini veya yordamını ekleyebilir, değiştirebilir veya silebilirsiniz. Sadece özniteliğe veya yordama Class.attribute (sınıf.özniteliği) olarak erişin. Ne zaman oluşturuldukları önemli değil, sınıfın özdeşleri bu değişikliklere saygı duyacaktır:
Oldukça müthiş. Ancak, önceden varolan yordamları değiştirmekle uğraşmayın, bu kötü bir formdur ve bu sınıfı kullanarak herhangi bir öbeği karıştırır. Öte yandan, yordamların eklenmesi çok daha az (ama yine de biraz) tehlikelidir.
Bir sınıfın özdeşi, bir Python öbeğidir ve her Python öbeğine benzer şekilde, şu özelliklere sahiptir: kimlik, öbek/nesne tipi, öznitelikler, yordamlar ve değeri. (identity, object type, attributes, methods, and value)
Bir sonraki açıklama için aşağıdaki sınıf tanımını kullanacağım. Öncelikle, c sınıfı ilan edelim, ve sonra obj olarak adlandırılan bu sınıfın bir özdeşini oluşturacağız.
Out[1]: 140040300870176
Out[2]: main.c
Out[3]: str
Kimlik[identity], öbek için ayrılan bellek konumudur. id() fonksiyonu kullanılarak tanımlanabilir.
Nesne tipi, öbeğin iç temsilidir. Her öbek için desteklenen yordam ve işlemi tanımlar. Belirli bir Nesnenin tipini öğrenmek için type() fonksiyonunu kullanabilirsiniz.
Nesne tiplerinden bahsederken, tüm sınıf konusundan kısa bir ara verelim ve sınıflar gibi davranmayan, uzantı modüllerinde tanımlanan Python öbeklerini inceleyelim.
Bir nesnenin öznitelikleri ve yordamları, öbek adından sonra bir nokta (.) yerleştirerek erişilmesi gereken bağlı özelliklerdir.
Sonunda, bir nesnenin değeri bir örnekle daha iyi görselleştirilir.
‘Andre’ dizesi, obj öbeğinin name özniteliğine atanan değerdir.
Artık nesneleri oluşturmak için myClass adlı sınıfı kullanabiliriz:
Bir sınıfın bir mislini oluşturmak için, sadece sınıf/öbek adını kullanarak sınıfı çağırır ve daha sonra init yordamının kabul ettiği ifadeleri iletirsiniz:
Bu gibi nesnelerdeki öznitelikleri değiştirebilirsiniz: p1’in yaşını 40’a ayarlayın:
Out [1]:
Ne yaptığınızı biliyorsanız, sınıfların nasıl karşılaştırıldığı, özniteliklerin nasıl tanımlandığı ve sınıfınızın alt sınıfları olarak kabul edilen sınıflar hakkında neredeyse tam kontrol sahibi olabilirsiniz.
Nesnelerin Özniteliklerini del
anahtar sözcüğünü kullanarak silebilirsiniz:
age özniteliğini p1 nesnesinden silin:
Out [1]:
Nesneleri del
anahtar sözcüğünü kullanarak silebilirsiniz:
p1 nesnesini silin:
Out [1]:
Sınıf nesneleri iki tür işlemi destekler: öznitelik referansları ve örnekleme.
Öznitelik referansları, Python: obj.name’deki tüm öznitelik referansları için kullanılan standart sözdizimini kullanır. Geçerli nesne adları, sınıf nesnesi oluşturulduğunda sınıfın ad alanındaki tüm adlardır. Yani, sınıf tanımı böyle görünüyorsa:
Out [1]:
sonra MyClass.i ve MyClass.f, sırasıyla bir tamsayı ve fonksiyon nesnesini döndüren geçerli öznitelik referanslarıdır. Sınıf öznitelikleri de atanabilir, böylece MyClass.i‘nin değerini atama yoluyla değiştirebilirsiniz. __doc__ ayrıca geçerli bir özniteliktir ve ‘Basit bir örnek sınıf’ sınıfa ait olan docstring döndürür.
Sınıf örnekleme, fonksiyon notasyonu kullanır. Sınıf nesnesinin, sadece sınıfın yeni bir örneğini döndüren parametresiz bir fonksiyon olduğunu varsayalım. Örneğin (yukarıdaki sınıfı varsayarak):
sınıfın yeni bir örneklemini oluşturur ve bu nesneyi x yerel değişkenine atar.
Örneklem işlemi boş bir nesne oluşturur.(bir sınıf nesnesini çağırmak) Birçok sınıf, belirli bir başlangıç durumuna göre özelleştirilmiş örneklemeler ile nesneler oluşturmayı sever. Bu nedenle, bir sınıf, __init__() adında özel bir yordam tanımlayabilir, bunun gibi:
Bir sınıf/öbek bir __init__() yordamını tanımladığında, sınıf/öbek örneklemesi otomatik olarak yeni oluşturulmuş sınıf örneği için __init__() yordamını çağırır. . Bu örnekte, yeni başlatılmış bir örnekleme şu şekilde elde edilebilir:
Elbette __init__() yordamı daha fazla esneklik için argümanlara sahip olabilir. Bu durumda, sınıf/öbek örnekleme işlecine verilen argümanlar __init__() öğesine iletilir. Örneğin,
Out[1]: (3.0, -4.5)
Şimdi eşleşen nesnelerle ne yapabiliriz? Eşleşen nesneler ile anlaşılan yegane işlemler, öznitelik atıflarıdır. İki tür geçerli atıf ismi vardır; data öznitelikleri ve yordamları.
Data öznitelikleri, Smalltalk’daki “eşleşen öznitelikler” ve C++’daki “data elemanlarına” karşılık gelir. Data özniteliklerinin beyan edilmesine gerek yoktur; yerel öznitelikler gibi, ilk atandıklarında var olurlar. Örneğin, x yukarıda oluşturulan MyClass özniteliğiyse, aşağıdaki kod parçası bir iz bırakmadan değeri 16 yazdıracaktır:
Diğer eşleşen öznitelik atıf türü bir yordamdır. Bir yordam, bir öbeğe “ait” bir fonksiyondur. (Python’da, yordam terimi, öbek eşleşmelerine özgü değildir: diğer öbek türleri de yordamlara sahip olabilir. Örneğin, liste öbekleri, append, insert, remove, sort adlı yordamları içerir. Ancak, aşağıdaki tartışmada, sadece aksi belirtilmedikçe sınıf yordamlarının eşleşen öbeklerinii belirtmek için deyim yordamını kullanacağız.)
Bir özdeş öbeğin geçerli yordam adları, sınıfına bağlıdır. Tanım olarak, bir sınıfın tüm öznitelikleri, eşleşen yordamlarına karşılık tanımlanan fonksiyon öbekleridir. Yani bizim örneğimizde, x.f geçerli bir yordam atfıdır, çünkü MyClass.f bir fonksiyondur, fakat x.i fonksiyon değildir çünkü MyClass.i da değildir. Ama x.f, MyClass.f ile aynı şey değildir - x.f, bir fonksiyon nesnesi/öbeği değil, bir yordam öbeğidir.
Nokta (.) operatörünü öbek ismi ile kullanarak erişebilirsiniz. Sınıf adı kullanarak da sınıf özdeğerlerine erişilebilir:
Genellikle, bağlantıdan hemen sonra bir yordam çağrılır:
MyClass örneğinde, ‘merhaba dünya’ dizesini döndürür. Ancak, bir yordamı hemen çağırmak gerekli değildir: x.f bir yordam öbeğidir ve daha sonra depolanabilir ve daha sonra çağrılabilir. Örneğin:
merhaba dünya zamanın sonuna kadar basmaya devam edecek.
Bir yordam çağrıldığında tam olarak ne olur? f() fonksiyon tanımı bir argüman belirtmiş olsa bile, x.f() öğesinin bir argüman olmadan çağrıldığını fark etmiş olabilirsiniz. Argümana ne oldu? Kesinlikle Python argüman gerektiren bir fonksiyon çağrılmadan çağrılır - argüman aslında kullanılmasa bile…
Aslında, cevabı tahmin etmiş olabilirsiniz: yordamlarla ilgili özel bir şey vardır ki, özdeş öbek fonksiyonun ilk ifadesi olarak geçirilir. Örneğimizde, x.f() çağrısı tam olarak MyClass.f(x) öğesine eşdeğerdir. Genel olarak, n argümanlı bir listeden bir yordamı çağırmak, ilk argümandan önce yordamın özdeş öbeğini ekleyerek oluşturulan bir argüman listesine karşılık fonksiyonu çağırmaya eşdeğerdir. Eğer isim geçerli bir sınıf özniteliğini işaret ederse ki bir fonksiyon öbeğidir, bir yordam öbeği özdeş öbek paketlenerek oluşturulur ve fonksiyon öbeği sadece soyut bir öbek ile birlikte bulunur: bu yordam öbeğidir. Yordam öbeği bir argüman listesi ile çağrıldığında yeni bir argüman listesi, argüman listesi ve özdeş öbekten inşa edilir ve fonksiyon öbeği yeni bir argüman listesi ile çağrılır.
Bir sınıf, bir öbek grubunu, kapsadığı veriler ve arayüz fonksiyonları tarafından izin verilen veriler üzerindeki işlemler açısından tanımlar.
Esas olarak, bir sınıf öbeklerin oluşturulabileceği bir şablondur.
Bir sınıftan oluşturulan her öbek sınıfın bir özdeşidir. Hepsi birbirine benziyor ve benzer bir davranış sergiliyorlar.
Bir sınıf, öbek öz niteliklerini (veri elemanları olarak da bilinir) ve öbeklerin davranışını (çoğunlukla yordamlar olarak bilinir) depolar. Bu davranış diğer (temel) sınıflardan miras alınabilir. Sınıfın yordam dışı öznitelikleri, genellikle sınıf elemanları veya sınıf öz nitelikleri olarak adlandırılır, böylece onlar özdeş öznitelikler ile karıştırılmaz.
Her sınıfın, tüm görevlerin ve fonksiyon tanımlarının meydana geldiği kendi ad alanı vardır.
Belirli bir sınıfın veya özdeşin, belirli bir öznitelik veya yordama sahip olup olmadığını bilmek gerekir mi? Yerleşik ‘hasattr’ işlevini kontrol etmek için kullanabilirsiniz; kontrol etmek için nesneyi ve özniteliği (dizge olarak) kabul eder. Dict ‘has_key’ yöntemine benzer şekilde kullanıyorsunuz (tamamen farklı olsa da):
Out[1]: True
Out[2]: True
Out[3]: False
Ayrıca, yerleşik işlev ‘getattr’ kullanarak özniteliğin varlığını kontrol edebilir ve tek adımda erişebilirsiniz.
getattr ayrıca, öbek ve özniteliği kontrol etmek için bir string dize olarak kabul eder. Eğer öznitelik bulunamazsa, varsayılanı veren isteğe bağlı üçüncü ifadeye sahiptir. Daha fazla aşina olabileceğiniz dict‘ın ‘get’ yordamından farklı olarak, varsayılan değer verilmediyse ve öznitelik bulunamadıysa, bir AttributeError oluşturulur:
Out[1]: 42
Out[2]: 'What?'
AttributeError: type object
'Class' has no attribute 'question'
Aşırı hasattr ve getattr kullanmayın. Sınıfınızı, bir özniteliğin var olup olmadığını kontrol etmeye devam etmeniz gereken bir şekilde yazmışsanız, yanlış yazmışsınız demektir. Sadece her zaman var olan değere sahip olur ve kullanılmıyorsa None (ya da her neyse) olarak ayarlayın. Bu fonksiyonlar en iyi şekilde çokbiçimliliği ele almak için kullanılır, Yani, fonksiyonunuzu / sınıfınızı / öbeklerin farklı türlerini desteklemenizi sağlar.
Python’daki sınıf düzeyinde tanımlanan tüm öznitelikler statik kabul edilir. Bu örneğe bakın:
5
5
6
5
6
7
Bana oldukça basit görünüyor. Sadece kafa karışıklığı gerçek olabilir, sınıfınızda aynı ad altında iki farklı değişkeniniz olabilir (bir statik ve bir sıradan). Ama bu davranışı tamamen önlemek için (kendi iyiliğiniz için) tavsiye ederim.
Python’da bir veri elemanı veya statik yordam nasıl bildirilir? Statik, özdeş seviyesinden ziyade bir sınıf düzeyinde eleman olduğu anlamına gelir. Statik öznitelikler, yalnızca sınıf başına tek özdeşte bulunur ve eşlenmez. Sınıfın bir eşleneğinde statik bir değişken değiştirilirse, değişiklik diğer tüm özdeşlerde değerini etkileyecektir.
Statik yöntemler, sınıfın herhangi bir eşleneğine başvurmaz ve dışında çağrılabilir. Ayrıca, belli sebeplerden dolayı sınıfın herhangi bir statik olmayan veri elemanına erişemezler. Python’dan nasıl statik hale getirileceğine bakalım.
Statik yordamlarla biraz daha karmaşık hale gelir. Python’da, bir sınıf içindeki statik yordamları tanımlamanın iki yolu vardır.
Her üç yordam tipi için basit örnekler içeren bir (Python 3) sınıfı yazarak başlayalım:
Method denilen MyClass
‘taki ilk yordam, normal bir eşleşen yordamdır.
Bu, çoğu zaman kullanacağınız temel, asgari ihtiyaçları karşılamaya yönelik yordam tipidir. Yordamın bir parametre self
aldığını görebilirsiniz, yordam çağrıldığında MyClass
eşleneğine işaret eder. (ama elbette özdeş yordamlar sadece bir parametreden fazlasını kabul edebilir).
self
parametresi aracılığıyla, eşlenen yordamlar, aynı öbek üzerindeki özniteliklere ve diğer yordamlara serbestçe erişebilir.Bu, bir öbeğin durumunu değiştirmeye sıra geldiğinde onlara çok fazla güç verir.
Onlar sadece öbeğin durumunu değiştirmezler, özdeş yordamlar, sınıfın kendisine self .__class__
özniteliği aracılığıyla da erişebilir. Bu, eşlenen yordamların sınıf durumunu da değiştirebileceği anlamına gelir.
Bazen bir sınıf yazarken, sınıftan çağrılan bir fonksiyonu dahil etmek istersiniz, özdeşini değil. Belki bu yordam yeni özdeşler oluşturur veya belki de herhangi bir özel özdeşin herhangi bir özniteliğinden bağımsızdır. Python, yordamınızın, hangi sınıfın çağırdığını bilmesi gerektiğine (ya da bilmesine) bağlı olarak, bunu yapmanın iki yolunu size verir. Her ikisi de yordamlarınıza dekoratörler uygulamasını içerir.
Düzgün bir özdeş yordam ilk ifade olarak özdeşi aldığı gibi bir ‘sınıf yordamı’ ilk ifade olarak sınıfı alır. Böylece yordam, kendi sınıfından veya bir alt sınıfından çağrılıyorsa farkındadır.
Bir ‘statik yordam’ nereden çağrıldığı hakkında hiçbir bilgi alamaz; ‘Statik yöntem’ nerede denir; bu aslında normal bir fonksiyonudur, sadece farklı bir kapsam içinde.
Sınıf ve statik yordamlar, sınıftan, Class.method() olarak veya Class().method() olarak bir özdeşten doğrudan çağrılabilir. Kendi sınıfı hariç özdeş göz ardı edilir. İşte düzgün bir özdeş yordam ile birlikte her biri için bir örnek:
Out [1]:
I was called from class <class '__main__.Class'>
I was called from class <class '__main__.Class'>
I have no idea where I was called from
I have no idea where I was called from
I was called from the instance <__main__.Class object at 0x7f6854953748>
Bunu ikinci yordam olan MyClass.classmethod
ile karşılaştıralım. Onu bir sınıf yordamı olarak işaret etmek için bu yordamı @classmethod
dekoratörüyle işaretledim.
Bir self
parametresini kabul etmek yerine, sınıf yordamları bir cls
parametresi alır, yordam çağrıldığında -öbek eşleneğine değil- sınıfa işaret eder.
Çünkü sınıf yordamı sadece bu cls
argümanına erişebilir, öbek eşleneğinin durumunu değiştiremez. Bu self
‘e erişim gerektirecektir. Ancak, sınıf yordamları hala sınıf durumunu değiştirebilir ki sınıfın tüm özdeşlerine uygulanır.
Üçüncü yöntem, bir statik yordam olarak işaret etmek için MyClass.staticmethod
bir @staticmethod
dekoratör ile işaretlendi.
Bu tip bir yordam ne self
ne de bir cls
parametresini alır (ama tabii ki, diğer parametrelerin rastgele sayısını kabul etmekte serbesttir).
Bu nedenle, statik bir yordam, öbek durumunu ve sınıf durumunu değiştiremez. Statik yordamlar, verilerde erişebilecekleri şeyleri sınırlandırır ve esas olarak yordamlarınızı adlandırmak için bir yoldur.
Bu dekoratör ile dekore edilen yordam isim uzayını sınıf ile paylaşır. Yordam tanımında hiçbir argümanın zorunlu olmadığını unutmayın. Statik yordam, sınıflara statik özniteliklerle erişebilir. Aşağıdaki örnekte bakın:
Example static() called
Example static() called
Offspring2 static() called
Python’da sınıf yordamı ve statik yordam arasındaki fark vardır. Bu sınıf yordamı, zorunlu bir argümanı - çağırdığı bir sınıf adını - alır. Bir bakalım:
Example static() called
Offspring1 static() called
Offspring2 static() called
Hangisini kullanmalısın? İlk seçenek, yalnızca aynı sınıftaki statik özniteliklere erişmenizi sağlar. İkinci yaklaşımda, alt sınıfların sınıf özniteliklerini, kalıtım sırasında yordamı yeniden tanımlamanın zorunluluğu olmadan değiştirebileceksiniz. İlk varyantı tercih ederim çünkü kişisel olarak daha temiz bir çözüm olduğunu düşünüyorum, ancak ikinci varyant da bazı durumlarda faydalı olabilir.
Bazı öznitelik değerleri, verilen bir sınıfın tüm öbeklerinde paylaşılır. Bu öznitelikler, sınıfın herhangi bir tek özdeşinden ziyade sınıfın kendisi ile ilişkilendirilir. Örneğin, bir bankanın hesap bakiyesine sabit faiz oranından faiz ödediğini söyleyelim. Bu faiz oranı değişebilir, ancak tüm hesaplarda paylaşılan tek bir değerdir.
Sınıf öznitelikleri, herhangi bir yordam tanımının dışında bir sınıf ifadesinin maiyetindeki atama ifadeleriyle oluşturulur. Daha geniş geliştirici topluluğunda, sınıf öznitelikleri de sınıf öznitelikleri veya statik öznitelikler olarak adlandırılabilir. Aşağıdaki sınıf deyimi, adı geçen Hesap[Account] için bir sınıf özniteliği oluşturur.
Bu öznitelik yine de sınıfın herhangi bir özdeşinden erişilebilir.
Out[1]: 0.02
Out[2]: 0.02
Out[3]: 0.04
Out[4]: 0.04
Bununla birlikte, bir sınıf özniteliğine yapılan tek bir atama ifadesi, sınıfın tüm özdeşleri için özniteliğin değerini değiştirir.
Öznitelik isimleri. Öbek sistemimize, adların belirli öznitelikleri nasıl çözümlendiğini belirtmek için yeterli karmaşıklığı sunduk. Sonuçta, aynı ada sahip bir sınıf özniteliğine ve bir özdeş niteliğe kolayca sahip olabiliriz.
Gördüğümüz gibi, bir nokta ifadeleri; bir ifadeden, bir noktadan ve bir isimden oluşur:
expression . name
Nokta ifadesini değerlendirmek için:
Bu değerlendirme prosedüründe, özdeş nitelikleri, sınıf özniteliklerinden önce bulunur, tıpkı yerel isimlerin bir ortamda küresel önceliğe sahip olması gibi. Sınıf içinde tanımlanan yordamlar, bu değerlendirme prosedürünün üçüncü aşaması sırasında nokta ifadesinin öbeğine bağlanır. Bir sınıfta bir isme bakma prosedürü, sınıf mirasını sunduğumuzda, kısa zamanda ortaya çıkacak ek nüanslara sahiptir.
Atama. Sol taraflarında bir nokta ifadesi içeren tüm atama ifadeleri, bu nokta ifadesinin öbeği için öznitelikleri etkiler. Öbek bir özdeşse, atama özdeş özniteliğini ayarlar. Öbek bir sınıfsa, atama bir sınıf niteliği ayarlar. Bu kuralın bir sonucu olarak, bir öbeğin özniteliğine atanması, sınıfının özniteliklerini etkileyemez. Aşağıdaki örnekler bu ayrımı göstermektedir.
Bir hesap özdeşini adlandırılmış öznitelik ilgi alanına atarsak, mevcut sınıf özniteliğiyle aynı ada sahip yeni bir özdeş özniteliği oluştururuz.
jim_account.interest = 0.08
ve bu öznitelik değeri bir nokta ifadesinden döndürülecek
jim_account.interest
0.08
Bununla birlikte, sınıf özniteliği, diğer tüm hesaplar için döndürülen orijinal değerini hala korur.
Sınıf özniteliğindeki değişiklikler tom_account‘ı etkiler, ancak jim_account için özdeş özniteliği etkilenmez.
Account.interest = 0.05 # sınıf özniteliğini değiştirme
Özdeş adlandırılmış özdeş öznitelikleri olmayan özdeşleri değiştirir.
tom_account.interest
0.05
ancak mevcut özdeş özniteliği etkilenmez
jim_account.interest
0.08
Sınıf öznitelikleri, tüm özdeşlerle paylaşılacakları sınıfa aittir. Bu öznitelikler, okunabilirlik için genellikle üst kısımdaki sınıf gövdesi parçalarında tanımlanmaktadır.
Out [1]:
1
2
2
Sınıf özniteliklerinden farklı olarak, özdeş öznitelikleri öbekler tarafından paylaşılmaz. Her öbeğin, özdeş özniteliğinin kendi kopyası vardır (Sınıf öniteliklerinin durumunda, tüm nesneler tek kopyaya başvurur).
Bir özdeşin / öbeğin özniteliklerini listelemek için iki fonksiyonumuz vardır: -
Dictionary form : {'salary': 4000, 'name': 'xyz'}
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'salary', 'show']
Daha önce sınıfların ve nesnelerin işlevselliğini ele aldık (ör. Yordamlar), şimdi veri kısmı hakkında bilgi verelim. Veri kısmı, yani alanlar, sınıfların ve öbeklerin ad alanlarına bağlı olan sıradan özniteliklerden başka bir şey değildir. Bu, bu adların yalnızca bu sınıflar ve öbekler bağlamında geçerli olduğu anlamına gelir. Bu yüzden isim alan adı verilir.
We have already discussed the functionality part of classes and objects (i.e. methods), now let us learn about the data part. The data part, i.e. fields, are nothing but ordinary variables that are bound to the namespaces of the classes and objects. This means that these names are valid within the context of these classes and objects only. That’s why they are called name spaces.
There are two types of fields - class variables and object variables which are classified depending on whether the class or the object owns the variables respectively.
Class variables are shared - they can be accessed by all instances of that class. There is only one copy of the class variable and when any one object makes a change to a class variable, that change will be seen by all the other instances.
Object variables are owned by each individual object/instance of the class. In this case, each object has its own copy of the field i.e. they are not shared and are not related in any way to the field by the same name in a different instance. An example will make this easy to understand (save as oop_objvar.py):
(Initializing R2-D2)
Greetings, my masters call me R2-D2.
We have 1 robots.
(Initializing C-3PO)
Greetings, my masters call me C-3PO.
We have 2 robots.
Robots can do some work here.
Robots have finished their work. So let's destroy them.
R2-D2 is being destroyed!
There are still 1 robots working.
C-3PO is being destroyed!
C-3PO was the last one.
We have 0 robots.
How It Works
This is a long example but helps demonstrate the nature of class and object variables. Here, population belongs to the Robot class and hence is a class variable. The name variable belongs to the object (it is assigned using self) and hence is an object variable.
Thus, we refer to the population class variable as Robot.population and not as self.population. We refer to the object variable name using self.name notation in the methods of that object. Remember this simple difference between class and object variables. Also note that an object variable with the same name as a class variable will hide the class variable!
Instead of Robot.population, we could have also used self.class.population because every object refers to its class via the self.class attribute.
The how_many is actually a method that belongs to the class and not to the object. This means we can define it as either a classmethod or a staticmethod depending on whether we need to know which class we are part of. Since we refer to a class variable, let’s use classmethod.
We have marked the how_many method as a class method using a decorator.
Decorators can be imagined to be a shortcut to calling a wrapper function (i.e. a function that “wraps” around another function so that it can do something before or after the inner function), so applying the @classmethod decorator is the same as calling:
how_many = classmethod(how_many) Observe that the init method is used to initialize the Robot instance with a name. In this method, we increase the population count by 1 since we have one more robot being added. Also observe that the values of self.name is specific to each object which indicates the nature of object variables.
Remember, that you must refer to the variables and methods of the same object using the self only. This is called an attribute reference.
In this program, we also see the use of docstrings for classes as well as methods. We can access the class docstring at runtime using Robot.doc and the method docstring as Robot.say_hi.doc
In the die method, we simply decrease the Robot.population count by 1.
All class members are public. One exception: If you use data members with names using the double underscore prefix such as __privatevar, Python uses name-mangling to effectively make it a private variable.
Thus, the convention followed is that any variable that is to be used only within the class or object should begin with an underscore and all other names are public and can be used by other classes/objects. Remember that this is only a convention and is not enforced by Python (except for the double underscore prefix).
new örnekleme ile oluşturan ve döndüren python özel yordamıdır.
Out [1]:
Creating instance of Sample
Initiating instance of Sample
Not: Örneklem ile oluşturulduktan sonra init yordamı çağrılır. Gerçek oluşturma işlemini kontrol etmek istiyorsanız, new yordamını kullanın.
Not:new, bir cls yordamı döndürürse, argümanların geri kalanıyla init çağrılır (...), aksi halde init çağrılmaz.
Not: Python sınıf kurucusunun iki adımı vardır: Örneklem ile oluşturmak için new çağırma ve başlatmak için init çağırma. init isteğe bağlı bir adım değildir, init başarısız olursa örneklem oluşturma da başarısız olur.
Yeni bir örneklemin oluşturulmasını kontrol etmeniz gerektiğinde new kullanın. Yeni bir örneklemin başlatılmasını kontrol etmeniz gerektiğinde init kullanın. new, örneklem oluşturmanın ilk adımıdır. İlk olarak adlandırılır, ve sınıfınızın yeni bir örneklemi döndürmekten sorumludur. Tezatında, init hiçbir şey döndürmez; yalnızca, oluşturulduktan sonra örneklemin başlatmasından sorumludur. Genel olarak, str, int, unicode veya tuple gibi bir değişmez tür alt sınıfını oluşturmuyorsanız new'yi geçersiz kılmanız gerekmez.
bir sınıf kurucu | x = MyClass() | x.__new__() |
bir örneklem başlatıcı | x = MyClass() | x.__init__() |
bir sınıf yıkıcı | del x | x.__del__() |
... istiyorsunuz. | ... yazıyorsunuz. | ... ve Python çağırıyor. |
---|
Yukarıdaki örnekler, en basit biçimde sınıflar ve nesnelerdir ve gerçek yaşam uygulamalarında gerçekten yararlı değildir.
Sınıfların manâsını anlamak için, yerleşik init yordamını anlamamız gerekir.
Tüm sınıflar, sınıf başlatıldığında her zaman çalıştırılan init adında bir yordama sahiptir.
Nesne özniteliklerine veya nesne oluşturulduğunda yapılması gereken diğer işlemlere değer atamak için init yordamını kullanın:
Out [1]:
Hello my name is John
Not: init bir sınıfın kurucusudur aslında başlatıcıdır. init yordamı, nesnenin belleğinin tahsis edildiği anda çağrılır.
Python sınıflarında özel bir önemi olan birçok yöntem ismi vardır. init yönteminin önemini şimdi göreceğiz.
init yordamı, bir sınıfın öbeği eşlendiğinde (yani oluşturulduğunda) çalıştırılır. Yordam, öbeğinizle yapmak istediğiniz herhangi bir eşleme işlemini yapmak için kullanışlıdır.(ilk değerleri nesnenize iletmek gibi). Adının başında ve sonunda çift alt çizgilere dikkat edin.
Hello, my name is Swaroop
Burada, __init__ yordamını bir parametre ismi (olağan self ile birlikte) olarak tanımlarız. Burada sadece name olarak da adlandırılan yeni bir alan yaratıyoruz. İkisi de ‘name’ olarak adlandırılsalar bile, bunlar iki farklı özniteliklerdir. Noktalı notasyon self.name, ‘self’ olarak adlandırılan öbeğin bir parçası olan ‘name’ adında bir şey olduğu anlamına gelir ve diğer name yerel bir değişkendir. Açıklamakta olduğumuz name açıkça belirttiğimizden karışıklık yok.
Person sınıfı için yeni özdeş p oluştururken, sınıf adını kullanarak bunu yaparız, ardından parantez içindeki argümanlar takip edilir: p = Person(‘Swaroop’).
__init__ yöntemini açıkça aramadık. Bu yordamın özel anlamı vardır.
Şimdi, self.name alanını say_hi yordamında gösterilen yordamlarımızda kullanabiliyoruz.
self sınıfın kendisine bir referanstır ve sınıfa ait özniteliklere erişmek için kullanılır. self diye isimlendirilmek zorunda değildir, ne ile istersen öyle çağırabilirsin, ama sınıftaki herhangi bir yordamın ilk parametresi olmalı:
Out [1]:
Hello my name is John
Not: self parametresi, sınıfa ait bir referanstır ve sınıfa ait özniteliklere erişmek için kullanılır.
Sınıf yordamları, sıradan fonksiyonlardan yalnızca belirli bir fark içerirler - parametre listesinin başına eklenmesi gereken fazladan bir ilk ada sahip olmaları gerekir, ancak yordamı çağırdığınızda bu parametre için bir değer vermezsiniz, Python bunu sağlayacaktır. Bu özel değişken, öbeğin kendisine atıfta bulunur ve sözleşmeye göre, kendisine self ad verilir.
Her ne kadar bu parametre için herhangi bir isim verseniz de, self ismini kullanmanız şiddetle tavsiye edilir. Standart bir ad kullanmanın birçok avantajı vardır - programınızın herhangi bir okuyucusu bunu hemen tanıyacaktır ve self kullanırsanız uzmanlaşmış IDE’ler (Entegre Geliştirme Ortamları) size yardımcı olabilir.
Not: Python'daki self, C ++'daki bu pointer ve Java ve C'deki bu referansa eşdeğerdir.
Python’un self için nasıl bir değer verdiğini ve neden bunun için bir değer vermeniz gerekmediğini merak etmelisiniz. Bir örnek bunu açıklığa kavuşturur. MyClass adlı bir sınıfınız olduğunu ve bu sınıfın bir özdeşinin myobject olarak adlandırdığınızı varsayalım. Bu nesnenin yordamını myobject.method(arg1, arg2) olarak çağırdığınızda, bu otomatik olarak Python tarafından MyClass.method(myobject, arg1, arg2) ‘ye dönüştürülür - bu, tüm özel self hakkındadır.
Bu aynı zamanda, hiçbir argüman almayan bir yordamınız varsa, o zaman hala tek bir argümana sahip olmanız gerektiği anlamına gelir - self.
Yordamlar, bir özdeşden çağrıldığında, ilk ifade olarak (genellikle ‘self’ olarak çağrılır) bu özdeşe geçirilen normal fonksiyonlardır. Herhangi bir nedenle fonksiyonu bir özdeşden çağırmıyorsanız, özdeşe her zaman ilk ifade olarak el ile geçirebilirsiniz. Örneğin:
Hey a method
Hey a method
Dahili olarak, bu ifadeler tamamen aynıdır.
super([type[, object-or-type]])
Bir ebeveyn veya kardeş sınıfına yordam çağrıları veren bir temsili öbeği döndürür. Bu, bir sınıfta geçersiz kılınan devralınan yordamlara erişmek için kullanışlıdır. Arama sırası, type‘ın kendisinin atlanması dışında getattr() tarafından kullanılanla aynıdır.
super için iki tipik kullanım durumu vardır. Tek bir kalıtımı olan bir sınıf hiyerarşisinde, super, açık bir şekilde adlandırmadan üst sınıflara başvurmak için kullanılabilir, bu nedenle kodu daha sürdürülebilir hale getirmektedir. Bu kullanım diğer programlama dillerinde süper kullanımı ile paralellik gösterir.
super(), Bir sınıfta geçersiz kılınan kalıtsal yordamlara erişmek için kullanılabilecek yerleşik bir fonksiyondur. super() sadece yeni stil sınıfları için çalışır; Tek bir kalıtımla bir sınıf hiyerarşisinde, super(), üst sınıflara açıkça ad vermeden başvurmak için kullanılabilir, böylece kodu daha fazla kullanılabilir hale getirir.
Base class method
Derived class method
Yukarıdaki örnekte, ana sınıfın printlnfo() yordamına erişmek için, super(Child, self).printlnfo() biçiminde super() yordamı kullanılır; burada taban sınıfının adı belirtilmemiştir. Diğer yol, Parent.printlnfo(self) kullanılarak olurdu.
Liste. Bir ağaç büyüdükçe odun katmanları eklenir. Mevsimler ve sıcaklıklar büyümesini etkiler. Halkalar bir liste olarak temsil edilebilir.
Öğeler eklenebilir, döngülenebilir veya sıralanabilir. Listeler diğer yapılarla birleştirilebilir. Bir ağaç gibi, listeyi büyütmek için elemanlar (katmanlar) ekliyoruz.
Bir örnek. Bir liste kapasitesini yönetir. Boş bir listeyle başlıyoruz. Ancak, onları ekledikçe sayılara uyacak şekilde genişler. Listeye eklediğimiz 4 öğe bu sırada saklanır.
İpucu: Sözlüğün aksine, Sıra bir listede garanti edilir. Liste sıralı bir koleksiyondur.
append: Bu yordam, liste özdeşinde (None ifadesine eşit olmamalıdır) çağrılır. Eklediğimiz değeri alır.
[1, 2, 6, 3]
Insert. Bir öğe bir listede herhangi bir yere eklenebilir. insert() ile ilk kısma veya listenin ortasındaki bir yere ekleyebiliriz.
Önemli: Sıra 1, ikinci eleman konumunu gösterir. Listeler sıfırdan başlayarak sıralanır -sıfır-tabanlıdır.
['dot', 'net', 'perls']
Extend. Bir liste extend() ile başka bir listeye eklenebilir. Bu yüzden bir listeyi sonuna kadar başka bir liste içerecek şekilde genişletiyoruz. Listeleri arda arda bağlarız (birleştiririz).
Dikkat: Bir liste eklemek için append() öğesini çağırmaya çalışırsak, yeni listenin tamamı sonuç listesinin tek bir öğesi olarak eklenecektir.
İpucu: Başka bir seçenek, bir for döngüsü kullanmak veya listeyi arda arda bağlayarak (genişletmek) için aralık sözdizimini kullanmaktır.
[1, 2, 3, 4, 5, 6]
Len. Bir liste belirli sayıda eleman içerir. Boşsa bu sıfır olabilir. Dahili bir yordam olan len ile eleman sayısına erişiriz.
['cat', 'dog']
2
Anahtar kelimede. Listede bir eleman mı? Bunu belirlemek için ‘in’ ve ‘not in’ ifadesini kullanıyoruz. Diğer yaklaşımlar mümkündür, ancak ‘in’ en basitidir. Burada ‘in’ ve ‘not in’ ile bir liste ararız.
1
3
4
Sort, reverse. Listeler, öğelerinin sırasını muhafaza eder. Ve yeniden düzenlenebilirler. Sıralama yordamıyla, öğelerin sırasını düşükten yükseğe doğru değiştiririz.
Ve: Tersine, öğelerin güncel sırasını tersine çeviririz. sort ve reverse tekrar birleştirebilir (tersine çevrilmiş bir sıralama için).
[2000, 100, 500, 400]
[100, 400, 500, 2000]
[2000, 500, 400, 100]
Sort, key. Bazen listedeki öğeler belirli bir şekilde sıralanmalıdır. Burada, liste karakterlerini son karakterlerine ve ardından ikinci karakterlerine göre sıralarız.
Def: Örnek önce sıralamak için key argümanı olarak bir def yordamını kullanır. -key equals- ‘Anahtar eşittir’ bölümü belirtilmelidir.
Lambda: Son olarak öğeleri sıralamak için alternatif bir sözdizimi formu, lambda ifadesi sunuyoruz. Bu ikinci -char- karakterini hedefler.
['bca', 'cab', 'abc']
['cab', 'abc', 'bca']
Remove, del. Bir değer üzerinde hareket eder. Önce bu değeri arar ve sonra kaldırır. Öğeler (bir -index- sırada) del ifadesiyle de kaldırılabilir.
Remove:: Bu listedeki ilk eşleşen öğeyi dışarı alır. Bunu birkaç kez çağırabiliriz ve listeyi değiştirmeye devam edebilir.
Del: Bu arada, öğeleri sıradan veya bir dizi grubunundan kaldırır. Del, -slice- dilim sözdizimini kullanır.
['Tommy', 'Janet', 'Bill']
['Tommy', 'Janet']
['Janet']
For-loop. Liste döngülerinde, Genellikle sıralamaya ihtiyacımız yok. Sadece sırayla elemanlara ihtiyacımız var. For döngüsü, bu durumda idealdir. Bir dizi değişkeninin bir diğeri ile karışıklığını ortadan kaldırır.
Burada: For döngüsü içindeki dört liste öğesinin her biriyle karşılaşırız. Döngü gövdesindeki ‘element’ tanımlayıcısını kullanıyoruz.
spider
moth
butterfly
Listeyi kapsamı tek bir ifadede tüm döngüyü ifade eder. Bu örnekte bir listeyi HTML dizgileri listesine çevirmek için liste kapsamayı kullanıyoruz.
Burada: Giriş listesindeki her dizgeye html yöntemini uygularız. Bu, capitalize() çağırır ve bir HTML parçasını döndürür.
Tanımlayıcı: Bu listedeki kapsamda, her dizgeye ‘x’ tanımlayıcısı verilir. Listedeki her öğeye Html() denir.
Liste Kapsamı, notlar. Liste kapsamında, bir koleksiyondaki her bir öğeye bir yöntem veya başka bir işlem uygularız. Bu son derece güçlüdür.
Ve: Sözdizimi kısadır, programcılar için okumayı ve taramayı kolaylaştırır. Sıkıcı for döngülerinden kaçınırız.
Kopya. Bir dilim sözdizimi kullanılarak bir liste kopyalanır. Dilimde rakam belirtmediğimizde, tüm listeyi kapsar. Bu nedenle, belirtilmemiş bir dilime atanarak, listeyi kopyalarız.
Yeniden Boyutlandır: Ayrıca bir listeyi yeniden boyutlandırabiliriz. Dilim sözdizimi ve append ) gibi yordamlar yararlıdır.
İkinci Kopya. Bazen yinelenen öğeleri bir listeden kaldırmak istiyoruz. Sıralama önemliyse, elemanların yeniden sıralanmasını önlemek için özel bir yönteme ihtiyacımız olabilir. Burada bir set faydalıdır.
iki boyutlu. Bir liste diğer listeleri içerebilir. Bu tür veri yapısını, iki boyutlu bir eleman ızgarası olarak kullanabiliriz. Bunlar pürüzlüdür. Alt listeler uzunluk olarak değişebilir.
İpucu: Liste listeleri, küçük grafikler ve koordinat aramasına ihtiyaç duyan diğer uygulamalar için yararlı olabilir, ancak büyük bir bellek alanı değildir.
Bitişik elemanlar. Çoğu zaman döngüde sadece bir elemana ihtiyacımız vardır. Ancak bazı durumlarda, karşılaştırmak için bitişik öğelere ihtiyacımız var. Burada listedeki bitişik öğelere ulaşıyoruz.
İpucu: Sıra 1’de başlama, anahtardır. Döngü gövdesinde, önceki öğeye ‘i-1’ sırasına ve geçerli öğeye erişiriz.
0 10
10 20
20 30
Format. Bir listemiz olduğunu varsayalım. Ondan bazı öğeleri bir dizgeye eklemek istiyoruz. Bunun için str.format kullanabiliriz. Format(), liste argümanları için özel desteğe sahiptir.
İpucu: format() ‘nin ikinci argümanı bir değişkene bir -identifier- tanımlayıcı atar ve dizge içindeki öğelere erişebiliriz.
The values are 10, 20 and 30
All built-in -yerleşik-. Tümüyle, tüm öğelerin True olarak değerlendirip değerlendirmediğini kontrol ederiz. Tek bir eleman bile yanlışsa, all() False değerini döndürür. Yöntem, elemanlar için standart bir boole değerlendirmesi kullanır.
False
True
Any built-in. Bu, yinelenen argümanı üzerinden döngü yapar (bir liste gibi). Eğer argümandaki elemanlardan ‘any’ True olarak değerlendirilirse, any() de True değerini döndürür. Yani True bir sonuç için tarar.
False: Hiçbir öğe True değilse, any() false değerini döndürür. Yani ‘not any’, ‘no True’ ile aynıdır.
True
False
Index, count. Sıralama metodu ile bir liste arayabiliriz. Ve sayımla, listedeki bir elemanın özdeş sayısını toplayabiliriz (sayım sırayla uygulanabilir).
Array -dizi-. Python’da bir liste bir diziden ayrıdır. Listeler küçük veri kümeleri için iyidir, ancak daha büyük miktarlarda veri için, diziler çok daha verimlidir. Genellikle % 90 daha az bellek kullanırlar.
Özeti. Bir liste elemanları doğrusal bir toplamayla birbiri ardına depolar.Python sayıları, dizeleri de dahil olmak üzere her türlü elemanı ele alır - hatta tuples ve diğer koleksiyonlar.
Faydaları, negatifler. Listeler basit bir sözdizimine sahiptir; bir tane oluşturmak için yalnızca birkaç karakter gerekir. Ve listeleri yeniden boyutlandırmak zorunda kalmayacağız. Ancak büyük veri kümeleri için aşırı bellek kullanırlar.
init örneği: Bu program bir sınıf oluşturur. Sınıf anahtar sözcüğünü kullanır ve iki yordam sunar. init yordamı özeldir. Bu bir kurucudur.
Not: init, parametreleri alır ve yeni sınıf özdeşine alanlar atar. Argümanları doğrulayabilir, hesaplamalar yapabilir, yordamları çağırır.
Box: İfadede Box(10, 2), Box sınıfının yeni bir eşleneğini oluşturuyoruz. Genişliği 10’a ayarlanır. Yüksekliği 2’ye ayarlanır.
Area: area() yordamı 20’ye dönecektir. Bu, init tarafından belirlenen bellekte depolanan değerlere dayanmaktadır.
20
Kalıtım. Bir sınıf, bir veya daha fazla başka sınıftan miras alabilir. Buradan türetmek istediğimiz sınıf tanımlanmalıdır. Türetilmiş sınıf, sınıf adından sonra parantez içinde belirtilir.
B sınıfı, A sınıfından türetilmiştir. Sınıflardan sonraki ifadelerde, boyutu (B sınıfından) ve genişliği (A sınıfıdan) çağırıyoruz.
Bir sınırlama. Dairesel sınıf devralın olamaz. Eğer A sınıfından B’ye ve A’dan B’ye türetmeye çalışırsanız, bir NameError alırsınız.
Size: Bu def yordamı doğrudan B sınıfında bulunur. Sınıf A’da yoktur.
Width: A sınıfı olan B sınıfının, temel sınıfı kontrol edilerek bulunur.
b, size called
a, width called
İki alt çizgi. Bir sınıfta, bazı elemanların isimlerinin başında iki altçizgi vardır. Bunlar özeldir. Python dili, onları özel olarak ele alır.
Sınıf dışından özel elemanlara erişilebilir, ancak başlangıçta _ClassName eklemeliyiz.
A sınıfında, __value adlı bir alanımız var. Bunu, sınıfın dışında _A__value olarak belirtmeliyiz, ancak içinde __value kullanabiliriz.
5
issubclass. Bu bir sınıfın diğerinden türetilmiş olup olmadığını belirler. Bu yerleşik yöntemle, iki sınıf ismini (özdeşini değil) geçiririz.
Dönüş: Birinci sınıf ikincisinden miras alırsa, issubclass true değerini döndürür. Aksi takdirde false döner.
İpucu: Bunun bilinmesi nadiren yararlıdır: Bir sınıf kendi alt sınıfında kabul edilir. Aşağıdaki üçüncü issubclass çağrısı bunu gösterir.
B says hello
1
3
isinstance. İlk argüman (bir değişken), ikinci argümanın (bir sınıfın) bir eşleneği olduğunda, isinstance true değerini döndürür. Eğer sınıf bir temel sınıfsa, aynı zamanda true döner.
Burada: Listeler gibi, bazı öznitelikler için, sınıf adı programda belirtilmemiş olabilir. Ama yine de ‘liste’ yi bu şekilde test edebiliriz.
1
3
repr. Bu bir sınıftan __repr__ yordamına erişir. repr ‘temsil’ anlamına gelir. Bir öbeği dize-string temsiline dönüştürür. Burada Snake özdeşini özel bir şekilde gösteriyoruz.
İpucu: repr yordamından bir dize döndürüyoruz. print yordamı, bir öbeğin __repr__ yordamını otomatik olarak çağırır.
Ve: Kullanılacak olan __repr__ yordamını kullanmaya zorlamak için repr‘i çağırabiliriz. Bu temsil dizgisini bir değişkende saklayabilmemizi sağlar.
Snake, type = Anaconda
Snake, type = Anaconda
Property. Bir değer alır ve ayarlar. Bu bir yordam gibidir, ancak daha basit bir sözdizimi kullanır. Bir property değişken gibi atanabilir. Bu, setter yordamının yürütülmesine neden olur.
Burada: Yerleşik property iki argüman iletiyoruz. getname‘i getter olarak belirledik ve setname setter olarak belirledik.
İpucu: Herhangi bir kod ifadesi, getname ve setter de kullanılabilir. Burada setname’ye iletilen dizgeyi büyük harfle yazıyoruz.
Snake: Bir Snake sınıf eşleneği oluşturuyoruz. Sonra “name” property atarız. Bu, Snake sınıfının setname yordamını çağırır.
Son olarak: “name” property değerini yazdırıyoruz. Bu getname yordamını çağırır.
Rattle
Süper. super() yerleşik ile, bir sınıfın üst öğesini alabiliriz. Bu derhal atası alır. Burada, üst sınıf öğesi olan Shape’e referans veren Circle sınıfında super() öğesini çağırıyoruz.
Yazdır: ‘Circle’dan name yordamını yazdırır. Daha sonra Shape’den name() de çağrılır.
Circle
Shape
Hash. Nesneleri karşılaştırırken, daha hızlı bir hash kodu kullanılabilir. Bir sözlük hash kullanır. __hash__ ile özel hash hesaplamaları uyguluyoruz. Eşsiz bir değer, iyi bir hash dır.
Burada: Bu programda, aynı isimlere ve renklere sahip iki Snake öbeği oluşturulur. unique_id, hash değerini hesaplamak için kullanılır.
55
105
id yordamı. Her öbeğin bir id si vardır. Bu özdeşe özgüdür. Tam sayı bir uygulama detayıdır ve program yürütmeleri arasında değişecektir. Burada sınıf id lerine bakıyoruz.
Not: Nesneler çöp toplayıcı tarafından kaldırıldığında ve kullanılmadığında id ler yeniden kullanılabilir. Kodlarda nadiren faydalıdırlar.
139888838995640
139888838995696
Classmethod, staticmethod. Python özel yordam tiplerini destekler (statik yordamlar gibi). Bunlar sınıf yordamları ve statik yordamlar.
Tipi. Yerleşik yordamlar, ifadeler içeren tipleri oluşturabilir ve değiştirebilir. Yerleşik tip ‘sınıf’ beyanının yerini alabilir. setattr ve getattr ile alanlar ekliyor veya yüklüyoruz.
Tipleri, özdeşler. Bir sınıf tanımıyla, bir tipin taslağını çıkarırız. Bu sınıflar şablonlardır. Kullanılmak üzere özdeş olarak oluşturulmalıdır (init sayesinde). Tipler özdeş değildir.
Modeller: Programlamada modelleri şablon olarak belirleriz. Ve yürütülebilir ifadelerde, bu şablonları hayata geçiririz (özdeş olarak).
Bir sınıfta, alanlardaki gibi verileri saklarız. Ayrıca, ref anahtar kelimesinde olduğu gibi, yordam uygulamalarını da sağlıyoruz. Bu önemli bir soyutlama seviyesi sağlar.
Bazı kavramlar. Sınıflar, verileri davranışa kolayca bağlayalım. Python programlarımızda bloklar oluşturuyorlar. Onlarla daha karmaşık modeller geliştiriyoruz.
Classmethod, staticmethod. Bir sınıf düşünün. Sınıfın bir özdeşini oluşturuyoruz. Fakat sınıfın bazı özellikleri bir özdeş gerektirmeyebilir - daha genel amaçlıdırlar.
Burada statik bir yordama ihtiyaç vardır. Statik bir yordam (‘staticmethod’ ile belirtilir), özdeş olarak çağrılan değil, tip ismine göre çağrılan yordam anlamına gelir.
Classmethod. Bu bir fonksiyon donatıcıdır. ‘def’ den önce @classmethod belirterek uygularız. Bir özdeş ve bir statik yordam birleşimidir. Her iki şekilde de çağrılabilir.
Yani: Biz classmethod örneğini, Box.example sözdizimi ile veya bir Box özdeşi ‘b’ den çağırabiliriz.
Sınıf: Sınıf argümanı (burada ‘cls’), bir tip oluşturarak ve onu döndürerek kullanılabilir. Ya da görmezden gelebiliriz.
Method called: cat
Method called: dog
Staticmethod. Statik bir yordam, self özdeşi kabul etmez. Bir sınıftaki çoğu yordam, ‘self’ adıyla ilk argümanı kabul eder. @staticmethod dekoratörüyle birlikte, bu argümanı atlıyoruz.
İpucu: Statik yordamlar herhangi bir değeri döndürebilir. Herhangi bir argümanı kabul edebilirler. Sınıf adıyla veya bir özdeşle çağrılırlar.
Ayrıca: Box.Message ile statik bir yordam mi, yoksa b.Message gibi bir özdeş mi aradığınız fark etmez.
Box Message 1
Box Message 2
Bir inceleme. Python programlarında sınıf yordamları ve statik yordamlar yararlıdır. Genellikle bir sınıfın, özdeş tabanlı olmayan bölümleri vardır. Bir özdeş gerektiren, hantal ve garip olacaktır.
Type. Python sınıfları destekler. Yerleşik type ile doğrudan tipleri oluşturabiliriz. Bu tiplerden sınıfları eşleştirebiliriz.
Setattr ile sınıflarımıza öznitelikler (alanlar) ekleyebiliriz. getattr ile bu değerleri alırız. Komut ifadeleri ile tipleri oluştururuz.
İlk örnek. Bu program, yerleşik tipler ile bir tip oluşturur. Bu, sınıf anahtar kelimesine alternatif bir sözdizimi formudur. Bu type adı ‘Cat’ olarak adlandırıyoruz.
İpucu: Bizim type, Python type ları için temel sınıfı, öbekten devralır. Ve başlangıç değerleri yoktur.
Setattr: Sınıf özdeşimize bir alan (veya öznitelik) eklemek için setattr kullanıyoruz. Sınıf özdeşini, öznitelik adını ve değerini iletiriz.
Getattr: Sonraki bir sınıfın özniteliğini almak için getattr’ı çağırıyoruz. Burada bu çağrı setattr tarafından ayarlanan değeri döndürür.
10
Dict. Bir type özniteliklerini sözlük argümanıyla başlatabiliriz. Bu üçüncü argümandır. Burada ‘paws’ özniteliğini 4 ve ‘weight’ özniteliğini -1 olarak ayarlıyorum.
İpucu: Bu bir sözlük özdeşidir. Diğer sözlükler gibi oluşturulabilir.
Yazdır: Bu değerleri bir Cat özdeşinde görüntüleriz. print yerleşik yöntemini kullanıyoruz.
Paws = 4
Weight = -1
Hasattr. getattr ve setattr den başka iki yerleşik işlev vardır. hasattr ile sınıf eşleneğinde bir öznitelik (alan) olup olmadığını görürüz. Doğru veya Yanlış döndürür.
Delattr: delattr ile sınıftan bir öznitelik çıkarırız. Bu, del operatörü için başka bir sözdizimi formudur.
İpucu: Şeyleri kaldırmak için (bir sözlükten) del operatörünü kullanırız. Bu özel bir sözdizimi formudur.
True
False
type, setattr ve getattr’ı anlayarak, Python sınıflarının nasıl çalıştığı hakkında daha fazla şey öğreniyoruz. Bu bilgi daha iyi programlar yazmamıza yardımcı olur.
Python’daki ‘sınıf’ bildirimleri gibi ifadeler, ‘type’ gibi yerleşik yordam çağrılarına doğrudan çevrilebilir. Yüksek seviyeli parçaları uygulamak için dilin düşük seviyeli kısımları kullanılır.
Sözlük. Bir dil düşünün. Her kelime bir anlamla eşleşir. Bir kitap yazılı bir çalışmadır. Bir bulut yüzen sudur. Bir sözlükte anahtarları (kelimeleri) değerlere (anlamlara) eşleştiririz.
Python sözlükleri haritalardır. Köşeli parantezlerle, bir anahtardaki bir değeri atar ve ona erişiriz. get() ile bir varsayılan sonuç belirtebiliriz.
Örnek alın. Değerler almanın birçok yolu var. ‘[’ and ‘]’ karakterlerini kullanabiliriz. Doğrudan bu şekilde bir değere erişiyoruz. Ancak bu sözdizimi, anahtar-key bulunamazsa bir KeyError’a neden olur.
Bunun yerine: 1 veya 2 argümanlı get() yordamını kullanabiliriz. Bu herhangi bir hataya neden olmaz - hiçbiri döndürmez.
Argüman 1: get() için ilk argüman, test ettiğiniz anahtardır. Bu argüman gereklidir.
Argument 2: get() için ikinci isteğe bağlı bağımsız argüman, varsayılan değerdir. Anahtar bulunmazsa bu iade edilir.
2
None
no tuna found
Get, None. Python’da ‘None’, null veya nil gibi özel bir değerdir. Programlarda genellikle None kullanırız. Bu bir değer değil demektir. Bir sözlükte değer bulunamazsa get() None değerini döndürür.
Not: None’a bir anahtar atamak için geçerlidir. Yani get() None yazamaz, ancak sözlükte aslında bir None değeri vardır.
KeyError. Programlardaki hatalar sadece sizi rahatsız etmek için orada değildir. Bir programla ilgili problemleri gösterir ve daha iyi çalışmasına yardımcı olurlar. Geçersiz erişimde bir KeyError oluşur.
Traceback (most recent call last):
File "stdin", line 4, in module
print(lookup["fish"])
KeyError: 'fish'
KeyError. Bir sözlük bir KeyError’un oluşmasına neden olabilir. Bu, sözlüğün yanlış kullanımı nedeniyle gerçekleşir. KeyError’ı çoğu durumda, sözlükteki get() yordamını kullanarak önleyebiliriz.
Örnek. Bu program bir KeyError’un atılmasına neden olur. Sözlük sadece üç giriş içerir - bunlar ‘a’, ‘b’ ve ‘c’ tuşlarını içerir. Bir ‘d’ anahtarına erişmeye çalışıyoruz, ancak mevcut değil. Ve bir KeyError ile karşılaşıldı.
Sonra, KeyError’ı try-except yapısında yakalarız. Bir except-block ta bir hata mesajı yazdırıyoruz. Son olarak, exceptions-istisnaları ele aldıktan sonra, get() yöntemiyle ‘d’ anahtarına erişiriz. Bu güvenli. exception-olağandışılık yok.
KeyError encountered
None
Python programlarında bir KeyError önlenebilir. Soruna, doğrudan anahtara erişmek yerine get() gibi güvenli bir yordam kullanarak giderdik. Var olduğundan eminsek, sadece bir anahtara doğrudan erişebiliriz.
Ayrıca: Programınızda herhangi bir doğrudan erişim oluşursa, kodunuz yeni veya test edilmemişse, bir try-except bloğu kullanmak faydalı olabilir.
Özet. KeyError, Python’da önlenebilir bir istisnadır. Bir sözlük yanlış kullanıldığında ortaya çıkar. Bu hatayı önlemek için iki yol gördük. Bir try-except ifadesi kullandık. Ve değer erişimini get() yordam çağrısı ile değiştirdik.
In-keyword. Bir sözlük belirli bir anahtar-key içerebilir (veya içermeyebilir). Çoğu zaman varlığını test etmemiz gerekir. Bunu yapmanın bir yolu, anahtar kelime iledir.
True: Bu anahtar, sözlükteki bir anahtar/değer çiftinin parçası olarak mevcutsa 1 (true anlamında) döndürür.
False: Anahtar yoksa, in-keyword, false değerini gösteren 0 değerini döndürür. Bu if-komut ifadelerinde yararlıdır.
Has tuna
No elephant
Len yerleşik. Bu, sözlükteki key-value anahtar/değer çiftlerinin sayısını döndürür. Anahtarların ve değerlerin veri tipleri önemli değil. Len ayrıca listelerde ve strings dizelerde çalışır.
Dikkat: Sözlük için döndürülen length uzunluk, anahtarları ve değerleri ayrı ayrı dikkate almaz. Her bir çift, uzunluğa birini ekler.
Length: 2
Len notları. İncelememiz gerek. Len() sadece sözlükler değil, diğer veri tiplerinde kullanılabilir. İçindeki eleman sayısını döndürerek bir liste üzerinde hareket eder. Ayrıca -tuples - öznitelikler grubunu da ele alır.
Len. Her şeyin uzunluğu var. Evrenimiz bile, sürekli genişlemede, bir uzunluğa sahiptir. Python’da olsa çoğunlukla -strings, lists, collections - dizgiler, listeler, koleksiyonlar - evren değil uzunluklarını ölçüyoruz.
Len’i kullanıyoruz. Çoğu zaman performansı len ile optimize edebiliriz. Öğelerin sayısı, hesaplanamayan, öbek üzerinde depolanır, bu yüzden len hızlıdır.
Strings. Len bir dizedeki karakter sayısını döndürür. Boşlukları, noktalama işaretlerini ve tüm karakterleri aynı sayar. None değişkeninin uzunluğunu almamıza dikkat etmeliyiz - bu başarısız olur.
Boş: İkinci telefon çağrısı boş bir dizeyi sınar. Bu dizede sıfır karakter var, ancak None değil.
TypeError: Len, iletilen değişkenin tipine dayanır. Bir NoneType len yerleşik desteğe sahip değildir.
3
0
TypeError: object of type
'NoneType' has no len()
Collections. Yerleşik len, bir koleksiyondaki elemanların sayısını döndürür. İç içe geçmiş, alt koleksiyonlar içeren bir koleksiyon için sayım sığdır: tüm iç içe geçmiş öğeler dikkate alınmaz.
Dictionary: Sözlük için, her bir çift bir birim olarak sayılır. Anahtarlar ve değerler bağımsız değil.
3
4
3
2
Özyineleme. -recurse- Özyinelemeyle, tüm olasılıkları denemek için çözümler ararız. Yinelemeli bir yöntemin bir sonlandırma koşulu (bir hedef) olmalıdır. Ve bir döngüde, değişen argümanlar ile kendini çağırabilir. Bu şekilde arama şubeleri dışarı çıkar.
Değişiklik. Bu program, son paraların saklandığı boş bir bozuk paralar listesiyle başlar. Ayrıca, her biri 1 veya 5 kuruş gibi olası madeni para miktarlarını da belirtir. Değişim çağrısında (en aşağıya), 51 sent’lik bir hedef miktar belirtiyoruz.
Change: Bu özyinelemeli bir yöntemdir. İlk önce hedef tutarımızı toplayıp toplamadığımızı kontrol eder. Sonra bir döngüde yeni paralar eklemeye çalışır.
Eklemek için bir bozuk para bulduğumuzda, değişimde, paralar listemizi bir dilim ile kopyalarız. Sonra yeni parayı ekliyoruz. Her bir özyinel çağrının kendi listesi olması gerektiğinden, kopyalanması önemlidir. Hedef tutarımıza ulaştığımızda madeni paralarımızı gösteririz.
Gösterge: Bu def-method tüm olası miktarlar üzerinde döngü yapar ve -amount- miktar tarafından toplanan para sayısını gösterir.
1 : 1
5 : 0
10 : 0
25 : 0
50 : 1
Çıktı 51 toplam kuruş yapmak için birçok olası para çeşitleri içerir. İlk olarak 51 adet tek parça kullanabileceğimizi öğreniyoruz. Daha sonra, bir adet 46 kuruş ve 1 beş kuruşluk bir parça kullanabiliriz. Bunlar her ikisi de 51 kuruş kadardır.
Son olarak: Birçok atlanan sonuçtan sonra gösterilen, son sonuçta 1 tek-kuruş ve 50 kuruş para kullanıyoruz.
Özyinelemeyi kullanırken, özyinelemeli yöntemde çekler (if ifadeleri gibi) 51 kuruşu geçip (hedefimiz) devam etmenin anlamı yok.
Ve: Biz ilerledikçe (değişimde) sadece daha büyük veya eşit değerde paralar ekliyoruz. Bu, aramayı daha da kolaylaştırır.
SICP. Bu örnek, klasik bir programlama metni olan Bilgisayar Programlarının Yapısı ve Yorumundan alınmıştır. Özyineleme, bir soruna kaba-arama uygulamanın bir yoludur. Birçok sorun bu şekilde çözülebilir.
İpucu: Bulmaca gibi oyun problemlerini çözme, bunun gibi yinelemeli yöntemlerle mükemmel bir öğrenme alıştırmasıdır.
Özet. Yinelemeli bir yöntem, olası her seçeneği deneyerek birçok sorunu çözebilir. Buradaki değişim bulmaca, kaba kuvvetli bir şekilde çözülür. Her olası kuruşu her bir yineleme seviyesinde deneriz.
İç içe geçmiş listeler. İç içe geçmiş koleksiyonları tekrar gözden geçirelim. Bir koleksiyonun kendisi bir elementtir, bu yüzden sadece bir kez sayar. Yerleşik len, tekrarlamaz. Döngü bile değil. Basit.
Böylece: Özel kod ile bu şeyleri (yinelemeli, döngü) yapmalıyız. Alt elemanları test edebilir ve len’i kullanabiliriz.
3
2
Hata. Herhangi bir değişkenin lenmesini alamayız. Bu program int değişkeninin uzunluğunu almaya çalışır. Ve, işini bitiren bir TypeError ile sefil bir şekilde başarısız olur.
Not: Kavramsal olarak len() sayılabilir birimleri sayar: bir dizgede chars, listedeki öğeler. Bir sayının rakamı vardır, ancak başka ‘birimleri’ yoktur.
length = len(value)
TypeError: object of type 'int' has no len()
Performans. -collections- Koleksiyonların ve -strings- dizelerin uzunluğu hafızada bir sayı olarak saklanır. Bir döngüde olduğu gibi her erişildiğinde hesaplanmaz. Bu nedenle, len bir döngüden çok daha hızlıdır.
Here: Bir döngüde len ile bir dizinin uzunluğuna erişirim. Bu zamanlanmış. Sonra bir for döngüsünü test ediyorum.
Sonuç: Len erişmek için çok kere daha hızlıdır. For-loop, yalnızca değerlerinin önem taşıdığı karakterleri sayarken kullanışlıdır.
1406752804.325871
1406752804.606887
1406752806.05097
len = 0.281 s
for-loop = 1.444 s
Özet. Bir uzunluk negatif olamaz. Bu yüzden len’i bir döngü sınırı olarak kullanabiliriz: Bu bir liste üzerinde döngü yapmak için uygun bir yoldur. Ancak gerekmediğinde, len kullanmaktan kaçınmak idealdir.
Döngü önerisi. Len kullanmaktan kaçınmak için bir for-in döngü düşünün. Bu döngü yapısı, her öğeyi bir koleksiyonda numaralandıracaktır. Dizin endeksleri gerekli değildir.