Süper Üye
Üyelik Tarihi: 14-09-2017
Yorum Sayısı: 263
Konu Sayısı: 1
Rep Puanı:
3
10-01-2019, Saat: 14:46
(Son Düzenleme: 10-01-2019, Saat: 15:17, Düzenleyen: excel.)
@Fearme23
Sadece şunu deneyerek de cls'nin nasıl çalıştığını anlayabilirsin:
PHP Kod:
class Test(): def __init__(self): print('__init__ çağrıldı.')
@classmethod def foo(cls): cls()
Test.foo()
yukardaki kodun çıktısı __init__ çağrıldı olacaktır. buradan anlıyoruz ki @classmethod olarak tanımlanmış fonksiyonda cls sınıf ismi için bi shorthand'den başka birşey değil. yani
cls() ile Test() aynı işi yapıyor, yeni bir instance(örnek) oluşturuyor. ha neden böyle birşey var dersen ben de bilmiyorum @staticmethod da aynı işi görmüyo mu nasıl olsa?
şurdan teknik ayrıntıları okuyabilirsin: https://stackoverflow.com/questions/1217...r-beginner
Şimdi normalde __init__ fonksiyonu, ilgili sınıf çağırılınca otomatik çalışıyor. Ama classmethod kullanımında sen çağırmazsan çalışmıyor. Classmethod ile __init__ çağırmak için cls() fonksiyonu kullanıyor.
aslında yine çalışır da sınıf çağırırken
Test().foo()
şeklinde çağırmak gerek veya parametre varsa
Test(parametre).foo() gibi...
Süper Üye
Üyelik Tarihi: 14-09-2017
Yorum Sayısı: 263
Konu Sayısı: 1
Rep Puanı:
3
Alıntı:Ama classmethod kullanımında sen çağırmazsan çalışmıyor.
static (durağan, sabit) denmesinin sebebi de o işte. sınıfın yeni örnekleri oluşturuldukça dinamik alt öğelerden de birer kopya oluşturulurken statik öğeler kopyalanmıyor.
Üst Üye
Üyelik Tarihi: 03-02-2016
Yorum Sayısı: 136
Konu Sayısı: 8
Rep Puanı:
4
@excel özellikle örnek çok iyi oldu teşekkür ederim
gecemor şimdilik mantığını anladım hocam örnek metodu oluşturulmadan, sınıf metodu yardımıyla örnek metodları çağırılıyor. Tabii tam anlamıyla kavradım desem de yalan olur ama sanırım haşır neşir oldukça daha net kafamda oturacak.
Aslında şu şekilde bir örnek de verebiliriz.
PHP Kod:
class ana_sinif: def __init__(self): print "ana siniftan selamlar" class ek_sinif(ana_sinif):
@classmethod def fonksiyon(cls): print "fonksiyon'dan selamlar"
@classmethod def fonksiyon2(cls): cls()
şimdi diyelimki bizim elimizde ana_sinif adında bir sınıf var ve buna ek olarak bir sınıf oluşturmak istedik, adını da ek_sinif koyduk ama ana sınıftan da kopmamak için parametreye ana_sinif'ı tanımladık.
Kod:
ek_sinif.fonksiyon()
şeklinde çağırırsak çıktı "fonksiyon'dan selamlar" olacaktır.
Kod:
ek_sinif.fonksiyon2()
olarak çağırdığımızda da "ana siniftan selamlar" çıktısını görürüz. Oysaki ek_sinif tan bir fonksiyon çağırmıştık ama cls() fonksiyonu bizi ana_sinif'taki __init__() fonksiyonuna yönlendirdi.
Ek olarak, eğer istersek şu şekilde de tanımlama yaparak sınıflar içindeki fonksiyonlarımızı çağırabiliriz.
Kod:
ana_sinif.fonksiyon = ek_sinif.fonksiyon
ana_sinif.fonksiyon()
tabi kullanıma göre örnekler çoğaltılabilir.
Üst Üye
Üyelik Tarihi: 03-02-2016
Yorum Sayısı: 136
Konu Sayısı: 8
Rep Puanı:
4
11-01-2019, Saat: 01:29
(Son Düzenleme: 11-01-2019, Saat: 01:33, Düzenleyen: Fearme23.)
(11-01-2019, Saat: 00:24)gecemor Nickli Kullanıcıdan Alıntı: Aslında şu şekilde bir örnek de verebiliriz.
PHP Kod:
class ana_sinif: def __init__(self): print "ana siniftan selamlar" class ek_sinif(ana_sinif):
@classmethod def fonksiyon(cls): print "fonksiyon'dan selamlar"
@classmethod def fonksiyon2(cls): cls()
şimdi diyelimki bizim elimizde ana_sinif adında bir sınıf var ve buna ek olarak bir sınıf oluşturmak istedik, adını da ek_sinif koyduk ama ana sınıftan da kopmamak için parametreye ana_sinif'ı tanımladık.
Kod:
ek_sinif.fonksiyon()
şeklinde çağırırsak çıktı "fonksiyon'dan selamlar" olacaktır.
Kod:
ek_sinif.fonksiyon2()
olarak çağırdığımızda da "ana siniftan selamlar" çıktısını görürüz. Oysaki ek_sinif tan bir fonksiyon çağırmıştık ama cls() fonksiyonu bizi ana_sinif'taki __init__() fonksiyonuna yönlendirdi.
Ek olarak, eğer istersek şu şekilde de tanımlama yaparak sınıflar içindeki fonksiyonlarımızı çağırabiliriz.
Kod:
ana_sinif.fonksiyon = ek_sinif.fonksiyon
ana_sinif.fonksiyon()
tabi kullanıma göre örnekler çoğaltılabilir.
Anladıklarımı toparlamam gerekirse,
cls parametresi,sınıf metodu altında sade bir "cls()" (tıpkı bir fonksiyon çağırır gibi.) şeklinde kullanılınca sınıfın aslında kendisini çağırmış oluyoruz.
Ve olmazsa olmaz değil. Fakat cls()'nin bize sağladığı asıl avantaj(Örnekleme yapmadan init fonksiyonuna ulaşmak haricinde.) kodun bütünlüğünü, düzenini, görselliğini daha iyi ifade etmeye olanak sağlaması. Doğru mudur hocam ?
amacı sadece düzen tertip etmek değil, olmasa da olur diyemeyiz. Sadece yerine göre, kullanım alanına göre bir işlevselliği olduğunu söyleyebiliriz. Buna ancak vakti geldiğinde öyle bir metod ve fonksiyona ihtiyaç olduğunda daha iyi anlaşılacağını düşünüyorum.
Üst Üye
Üyelik Tarihi: 03-02-2016
Yorum Sayısı: 136
Konu Sayısı: 8
Rep Puanı:
4
Selamlar istihza pdf den nesne tabanlı programlama konusunu da bitirdim şükür. Bundan sonrası için ise PyQt5 öğrenmek istiyorum fakat öncesinde temel konularda yeterince egzersiz yapıp tecrübe kazanmak( bu süreçte temel modüller,veri tipleri vs.. tamamen benimseme), gerek elbet. Bunu için en iyi yol, bir proje belirleyip onun üzerinde çalışmak. Ezcümle proje tavsiyesinde bulunabilir misiniz acaba ?.
Kendi yaptığım sadece 2 proje var:
1- bir video sitesine selenium, kimi zaman requests ile bağlanıp beatifulsoup ile ordan gerekli alanları çekip youtube_dl ile indirme
2-Online çeviri.
Şimdiden teşekkürler.
(14-01-2019, Saat: 23:22)Fearme23 Nickli Kullanıcıdan Alıntı: Selamlar istihza pdf den nesne tabanlı programlama konusunu da bitirdim şükür. Bundan sonrası için ise PyQt5 öğrenmek istiyorum fakat öncesinde temel konularda yeterince egzersiz yapıp tecrübe kazanmak( bu süreçte temel modüller,veri tipleri vs.. tamamen benimseme), gerek elbet. Bunu için en iyi yol, bir proje belirleyip onun üzerinde çalışmak. Ezcümle proje tavsiyesinde bulunabilir misiniz acaba ?.
Kendi yaptığım sadece 2 proje var:
1- bir video sitesine selenium, kimi zaman requests ile bağlanıp beatifulsoup ile ordan gerekli alanları çekip youtube_dl ile indirme
2-Online çeviri.
Şimdiden teşekkürler.
Tebrikler, seni de istihza mezunu ettik desene
Evet pekiştirmek için bol bol pratik yapmak şart, tecrübe edindikçe taşlar yerine oturacak, neyin ne işe yaradığı daha iyi anlaşılacak.
Proje olarak gündelik olarak internet veya bilgisayar, hatta akıllı telefon kullanımında işine yarayabilecek irili ufaklı çalışmalar yapabilirsin.
Mesela Tkinter ile arayüz programlamaya da başlayabilirsin ufaktan ufaktan.
Hatta daha büyük projeler de düşünebilirsin. Bazıları "daha yeni başlamışsın ufak projelere yönel" gibi düşünebilir fakat hedefini ne kadar yüksek tutarsan daha iyi odaklanıp öğrenmen o kadar kısa sürer. Örneğin, ben hiç kivy bilmiyorken kafamda bir android uygulaması projesi tasarladım ve bir gün damdan düşer gibi daldım. Kivy ile ilgili doğru belli Türkçe kaynak yokken ve kodları yazdıktan sonra nasıl apk yapacağımı dahi bilmeden kolları sıvadım, bir süre sonra hem kivy öğrendim hem de uygulamamı yazmış oldum. O süreç bana daha da tecrübe kazandırdı, ingilizce kaynaklardan (github, stackoverflow) neyi nasıl aramam gerektiği ve bir konuda nasıl bilgi sahibi olacağım konusunda kendimi daha da geliştirmiş oldum.
|