5. Sınıflar ve nesneler
Sınıf, nesnelerin oluşturulduğu kalıptır. Nesne, bir sınıfın örneği olarak tanımlanır.
![]() |
5.1. Bir Nesne sınıfı
Program (classes_01)
# -*- coding=utf-8 -*-
class Objet:
"""une classe Objet vide"""
# her değişken, yapısı gereği özniteliklere sahip olabilir
obj1=Objet()
obj1.attr1="un"
obj1.attr2=100
# nesneyi görüntüler
print "objet1=[{0},{1}]".format(obj1.attr1,obj1.attr2)
# nesneyi değiştirir
obj1.attr2+=100
# nesneyi görüntüler
print "objet1=[{0},{1}]".format(obj1.attr1,obj1.attr2)
# objet1 referansını objet2'ye atar
obj2=obj1
# obj2'yi değiştirir
obj2.attr2=0
# iki nesneyi görüntüler
print "objet1=[{0},{1}]".format(obj1.attr1,obj1.attr2)
print "objet2=[{0},{1}]".format(obj2.attr1,obj2.attr2)
Notlar:
-
- satır: başka bir yorum biçimi. Önüne üç " işareti konulan bu yorum, birden fazla satıra yayılabilir;
- 3-4. satırlar: boş bir nesne sınıfı;
-
- satır: Objet sınıfının örneklenmesi;
-
- satır: referansların kopyalanması. obj1 ve obj2 değişkenleri, aynı nesneye işaret eden iki işaretçidir (referans).
Sonuçlar
5.2. Bir Kişi sınıfı
Program (classes_02)
# -*- coding=utf-8 -*-
class Personne:
# sınıfın öznitelikleri
# bildirilmemiş - dinamik olarak oluşturulabilir
# yöntem
def identite(self):
# ilk bakışta, mevcut olmayan öznitelikleri kullanıyor
return "[{0},{1},{2}]".format(self.prenom,self.nom,self.age)
# ---------------------------------- main
# öznitelikler genel ve dinamik olarak oluşturulabilir
p=Personne()
p.prenom="Paul"
p.nom="Langevin"
p.age=48
# yöntem çağrısı
print "personne={0}\n".format(p.identite())
Notlar:
- 3-10. satırlar: bir yöntem içeren bir sınıf;
-
- satır: Bir sınıfın herhangi bir yönteminin ilk parametresi, geçerli nesneyi belirten self nesnesi olmalıdır.
Sonuçlar
5.3. Oluşturucuya sahip Personne sınıfı
Program (classes_03)
# -*- coding=utf-8 -*-
class Personne:
# yapıcı
def __init__(self,prenom,nom,age):
self.prenom=prenom;
self.nom=nom;
self.age=age;
# yöntem
def identite(self):
# ilk bakışta, mevcut olmayan öznitelikler kullanıyor
return "[{0},{1},{2}]".format(self.prenom,self.nom,self.age)
# ---------------------------------- main
# bir Personne nesnesi
p=Personne("Paul","Langevin",48)
# bir yöntemin çağrılması
print "personne={0}\n".format(p.identite())
Notlar:
-
- satır: Sınıfın oluşturucusunun adı __init__'tir. Diğer yöntemlerde olduğu gibi, ilk parametresi self'tir;
-
- satır: Sınıfın oluşturucusu kullanılarak bir Personne nesnesi oluşturulur.
Sonuçlar
5.4. Oluşturucuda geçerlilik denetimleri içeren Personne sınıfı
Program (classes_04)
# -*- coding=utf-8 -*-
import re
# -------------------
# özel bir istisna sınıfı
class MyError(Exception):
pass
class Personne:
# yapıcı
def __init__(self,prenom="x",nom="x",age=0):
# ad alanı boş olmamalıdır
match=re.match(r"^\s*(\S+)\s*$",prenom)
if not match:
raise MyError("Le prenom ne peut etre vide")
else:
self.prenom=match.groups()[0]
# soyadı boş olmamalıdır
match=re.match(r"^\s*(\S+)\s*$",nom)
if not match:
raise MyError("Le nom ne peut etre vide")
else:
self.nom=match.groups()[0]
# yaş geçerli olmalıdır
match=re.match(r"^\s*(\d+)\s*$",str(age))
if not match:
raise MyError("l'age doit etre un entier positif")
else:
self.age=match.groups()[0]
def __str__(self):
return "[{0},{1},{2}]".format(self.prenom,self.nom,self.age)
# ---------------------------------- el
# bir Kişi nesnesi
try:
p=Personne(" Paul "," Langevin ",48)
print "personne={0}".format(p)
except MyError, erreur:
print erreur
# başka bir Kişi nesnesi
try:
p=Personne(" xx "," yy "," zz")
print "personne={0}".format(p)
except MyError, erreur:
print erreur
# başka bir kişi
try:
p=Personne()
print "personne={0}".format(p)
except MyError, erreur:
print erreur
Notlar:
- 7-8. satırlar: Exception sınıfından türetilmiş bir MyError sınıfı. Bu sınıf, Exception sınıfına herhangi bir işlevsellik eklemez. Yalnızca özel bir istisna tanımlamak amacıyla eklenmiştir;
-
- satır: Oluşturucunun parametreleri için varsayılan değerler vardır. Dolayısıyla p=Personne() işlemi, p=Personne("x","x",0) ifadesine eşdeğerdir;
- 15-9. satırlar: prenom parametresi analiz edilir. Bu parametre boş olmamalıdır. Aksi takdirde, bir hata mesajıyla birlikte MyError istisnası tetiklenir;
- satır 21-25: isim için de aynısı geçerlidir;
- satır 27-31: yaş kontrolü;
- satır 33-34: __str__ işlevi, daha önce identite olarak adlandırılan yöntemin yerini alır;
- satır 38-42: bir kişinin örneği oluşturulur ve kimliği görüntülenir;
- satır 39: nesne oluşturma;
- satır 40: görüntüleme. İşlem, p kişisini bir karakter dizisi biçiminde görüntülemeyi gerektirir. Python yorumlayıcısı, varsa p.__str__() yöntemini otomatik olarak çağırır. Bu yöntem, Java’da veya .NET dillerinde toString() yöntemiyle aynı işlevi görür;
- 41-42. satırlar: MyError türünde olası bir istisnanın yönetimi. Ardından, istisnayla ilişkili hata mesajını görüntüler;
- 44-48. satırlar: hatalı parametrelerle örneklendirilmiş ikinci bir kişi için de aynısı;
- satır 50-54: Varsayılan parametrelerle oluşturulan üçüncü kişi için de aynı işlem yapılır.
Sonuçlar
5.5. İkinci bir oluşturucu görevi gören bir yöntem eklenmesi
Program (classes_05)
# -*- coding=utf-8 -*-
import re
# -------------------
# sahip olunan bir istisna sınıfı
class MyError(Exception):
pass
class Personne:
# sınıfın öznitelikleri
# bildirilmemiş - dinamik olarak oluşturulabilir
# yapıcı
def __init__(self,prenom="x",nom="x",age=0):
# ad alanı boş olmamalıdır
match=re.match(r"^\s*(\S+)\s*$",prenom)
if not match:
raise MyError("Le prenom ne peut etre vide")
else:
self.prenom=match.groups()[0]
# soyadı boş olmamalıdır
match=re.match(r"^\s*(\S+)\s*$",nom)
if not match:
raise MyError("Le nom ne peut etre vide")
else:
self.nom=match.groups()[0]
# yaş geçerli olmalıdır
match=re.match(r"^\s*(\d+)\s*$",str(age))
if not match:
raise MyError("l'age doit etre un entier positif")
else:
self.age=match.groups()[0]
def initWithPersonne(self,p):
# geçerli nesneyi p kişisiyle başlatır
self.__init__(p.prenom,p.nom,p.age)
def __str__(self):
return "[{0},{1},{2}]".format(self.prenom,self.nom,self.age)
# ---------------------------------- main
# bir Kişi nesnesi
try:
p0=Personne(" Paul "," Langevin ",48)
print "personne={0}".format(p0)
except MyError, erreur:
print erreur
# başka bir Kişi nesnesi
try:
p1=Personne(" xx "," yy "," zz")
print "personne={0}".format(p1)
except MyError, erreur:
print erreur
# başka bir kişi
p2=Personne()
try:
p2.initWithPersonne(p0)
print "personne={0}".format(p2)
except MyError, erreur:
print erreur
Notlar:
- Önceki komut dosyasıyla arasındaki fark 35-37. satırlarda yer almaktadır. initWithPersonne yöntemi eklenmiştir. Bu yöntem, __init__ oluşturucusunu çağırır. Tiplemeli dillerde olduğu gibi, parametrelerinin veya sonuçlarının niteliğine göre ayırt edilen aynı isimli yöntemlere sahip olma imkânı yoktur. Dolayısıyla, farklı parametrelerden (burada Personne türünde bir nesne) nesneyi oluşturan birden fazla yapıcıya sahip olma imkânı yoktur.
Sonuçlar
5.6. Kişi nesnelerinin listesi
Program (classes_06)
# -*- coding=utf-8 -*-
class Personne:
...
# ---------------------------------- ana
# kişi nesneleri listesinin oluşturulması
groupe=[Personne("Paul","Langevin",48), Personne("Sylvie","Lefur",70)]
# bu kişilerin kimlik bilgileri
for i in range(len(groupe)):
print "groupe[{0}]={1}".format(i,groupe[i])
Notlar:
- 3-5. satırlar: daha önce açıklanan Personne sınıfı
Sonuçlar
5.7. Kişi sınıfından türetilmiş bir sınıfın oluşturulması
Program (classes_07)
# -*- coding=utf-8 -*-
import re
class Personne:
...
class Enseignant(Personne):
def __init__(self,prenom="x",nom="x",age=0,discipline="x"):
Personne.__init__(self,prenom,nom,age)
self.discipline=discipline
def __str__(self):
return "[{0},{1},{2},{3}]".format(self.prenom,self.nom,self.age,self.discipline)
# ---------------------------------- ana
# Kişi nesneleri ve türevlerinin listesinin oluşturulması
groupe=[Enseignant("Paul","Langevin",48,"anglais"), Personne("Sylvie","Lefur",70)]
# bu kişilerin kimlik bilgileri
for i in range(len(groupe)):
print "groupe[{0}]={1}".format(i,groupe[i])
Notlar:
- 5-6. satırlar: önceden tanımlanmış Personne sınıfı;
-
- satır: Enseignant sınıfını Personne sınıfından türetilmiş bir sınıf olarak tanımlar;
-
- satır: Enseignant türetilmiş sınıfının oluşturucusu, Personne üst sınıfının oluşturucusunu çağırmalıdır;
- satır 21-22: groupe[i]'i görüntülemek için yorumlayıcı, groupe[i].__str__() yöntemini kullanır. Kullanılan __str__() yöntemi, aşağıdaki sonuçların da gösterdiği gibi, groupe[i] sınıfının gerçek yöntemidir.
Sonuçlar
5.8. Personne sınıfından türetilmiş ikinci bir sınıfın oluşturulması
Program (classes_08)
# -*- coding=utf-8 -*-
import re
class Personne:
...
class Enseignant(Personne):
...
class Etudiant(Personne):
def __init__(self,prenom="x",nom="x",age=0,formation="x"):
Personne.__init__(self,prenom,nom,age)
self.formation=formation
def __str__(self):
return "[{0},{1},{2},{3}]".format(self.prenom,self.nom,self.age,self.formation)
# ---------------------------------- ana
# Kişi ve türev nesnelerden oluşan bir listenin oluşturulması
groupe=[Enseignant("Paul","Langevin",48,"anglais"), Personne("Sylvie","Lefur",70), Etudiant("Steve","Boer",22,"iup2 qualite")]
# bu kişilerin kimlik bilgileri
for i in range(len(groupe)):
print "groupe[{0}]={1}".format(i,groupe[i])
Notlar:
- Bu komut dosyası bir öncekine benzerdir.
Sonuçlar
