Merhaba, yazdığınız kodlarda ufak değişiklikler yapmak zorunda kaldım. Bu kodları prosedürel yöntemle yazalım önce:
while True:
soru1 = input("Acaba sayınızı tek mi arzu edersiniz yoksa çift mi?\nCevap1:")
if soru1.lower() == "tek":
while True:
s2 = input("Sayınızı kaça kadar istersiniz?\nCevap2:")
if not s2.isnumeric():
print("Sayı girmediniz.")
continue
elif s2.isnumeric():
for i in range(int(s2)):
if i % 2 != 0:
print(i)
break
break
elif soru1.lower() == "çift":
while True:
s2 = input("Sayınızı kaça kadar istersiniz?\nCevap2:")
if not s2.isnumeric():
print("Sayı girmediniz.")
continue
elif s2.isnumeric():
for i in range(int(s2)):
if i % 2 == 0:
print(i)
break
break
else:
print("Lütfen cevap olarak '{}' veya '{}' yazınız.".format("tek", "çift"))
continue
Yukarıdaki kodları dilerseniz bir sınıf içinde veya bir fonksiyon içinde de tanımlayabilirsiniz. Hangi durumlarda fonksiyon veya sınıf içinde tanımlanır, bunun belli bir kuralı yok aslında. Fakat şöyle bir senaryo düşünün: Diyelim yukarıda yazılmış kodların yaptığı işlemlere benzer işlemler yapan başka kodlarınız var. Bu kodları düzenli durması için bir sınıfın içine yerleştirebilirsiniz. Ayrıca daha sonra başka bir programda, bu sınıfı programınızın içine aktararak sınıfa veya örneğe ait fonksiyonu çağırıp istediğiniz işlemleri yapabilirsiniz.
Şimdi yukarıdaki kodları önce bir sınıfın sınıf metodu haline getirelim:
class Sinif1:
@classmethod
def sinif_metodu(cls):
while True:
soru1 = input("Acaba sayınızı tek mi arzu edersiniz yoksa çift mi?\nCevap1:")
if soru1.lower() == "tek":
while True:
s2 = input("Sayınızı kaça kadar istersiniz?\nCevap2:")
if not s2.isnumeric():
print("Sayı girmediniz.")
continue
elif s2.isnumeric():
for i in range(int(s2)):
if i % 2 != 0:
print(i)
break
break
elif soru1.lower() == "çift":
while True:
s2 = input("Sayınızı kaça kadar istersiniz?\nCevap2:")
if not s2.isnumeric():
print("Sayı girmediniz.")
continue
elif s2.isnumeric():
for i in range(int(s2)):
if i % 2 == 0:
print(i)
break
break
else:
print("Lütfen cevap olarak '{}' veya '{}' yazınız.".format("tek", "çift"))
continue
Sınıf haline getirilmiş kodları çalıştırmak için bu kez şöyle bir çağırma yöntemi kullanırız:
Sinif1.sinif_metodu()
Şimdi ise bu kodları bir sınıfın örneğinin çağırdığı bir fonksiyon haline getirelim (örneğin çağırdığı fonksiyon örnek fonksiyonu değildir):
class Sinif2:
def __init__(self):
self.ornek_metodu()
@staticmethod
def ornek_metodu():
while True:
soru1 = input("Acaba sayınızı tek mi arzu edersiniz yoksa çift mi?\nCevap1:")
if soru1.lower() == "tek":
while True:
s2 = input("Sayınızı kaça kadar istersiniz?\nCevap2:")
if not s2.isnumeric():
print("Sayı girmediniz.")
continue
elif s2.isnumeric():
for i in range(int(s2)):
if i % 2 != 0:
print(i)
break
break
elif soru1.lower() == "çift":
while True:
s2 = input("Sayınızı kaça kadar istersiniz?\nCevap2:")
if not s2.isnumeric():
print("Sayı girmediniz.")
continue
elif s2.isnumeric():
for i in range(int(s2)):
if i % 2 == 0:
print(i)
break
break
else:
print("Lütfen cevap olarak '{}' veya '{}' yazınız.".format("tek", "çift"))
continue
Son sınıfta yer alan fonksiyonun çağrılma şekli ilk sınıfa göre biraz daha farklıdır:
Sinif2()
Bu iki sınıf arasındaki fark; ilk sınıfın herhangi bir örneği veya örnek metodu yoktur. Sınıf ismi kapsayıcı bir ad gibi davranır. Bu sınıfın içine istediğiniz kadar fonksiyon ekleyip daha sonra hangi fonksiyonu kullanmak istiyorsanız onu çağırabilirsiniz. İkinci sınıf init fonksiyonuyla sınıfa ait bir örnek tanımlar. Bu sınıfın örneğinin init fonksiyonu içinde başka bir fonksiyonu çağırdığına dikkat edin, Şayet fonksiyonun içinde örnekle (yani selfle) bir işlem yapmak istemiş olsaydık, @staticmethod bezeyicisini kullanmamamız gerekirdi. Fakat self ile bir işlem yapmayacağımız için fonksiyona @staticmethod bezeyicisini ekledik. İlk sınıftaki @classmethod bezeyicisi ise fonksiyonun sınıfa ait olduğunu belirtir.
Sorularınıza gelecek olursak:
-
Yazdığınız kodları bir modül olarak başka programlarda kullanmak istediğinizde, sınıfın içindeki bir metoda erişerek, metodu kendi programınızda kullanabilirsiniz. Mesela str() bir sınıf örneğini ifade eder ve str().lower() da bu örneğin kullandığı bir fonksiyonu. str().lower() fonksiyonunda olduğu gibi; önce sınıfa ait örneği sonra örnek metodunu çağırdığımız gibi kendi yazdığımız sınıflardaki fonksiyonları çağırabiliriz. Ama bazı sınıflardaki fonksiyonlara erişim örnek üzerinden değil de sınıf üzerinden yapılır. Örneğin modüller böyle sınıflardır. Bir fonksiyonu çağırdığımız gibi bir modülü çağıramayız. Yukarıdaki ilk sınıf örneği de bir modül gibi davranır ve bu sınıf da bir fonksiyon gibi çağrılamaz. Halbuki ikinci sınıfı bir fonksiyon gibi çağırabiliriz.
-
init fonksiyonun ikinci parametresi herhangi bir argümandır, yani fonksiyonunuzda eğer bir argüman kullanmanız gerekiyorsa argümanları self ifadesinden sonra yazmak gerekir. Argüman sayısı ihtiyacınıza göre çoğaltılabilir.
-
class ile yapılmış uygulama önerilerinden mi bahsediyorsunuz yoksa class konusunu anlatan önerilerden mi bahsediyorsunuz?