Nesneye Yönelik Python - Yapı Taşları

Bu bölümde, nesne yönelimli terimleri ve programlama kavramlarını ayrıntılı olarak tartışacağız. Sınıf, bir örnek için sadece bir fabrikadır. Bu fabrika, örneklerin nasıl yapılacağını açıklayan planı içerir. Sınıftan bir örnek veya nesne oluşturulur. Çoğu durumda, bir sınıfın birden fazla örneğine sahip olabiliriz. Her örneğin bir dizi özniteliği vardır ve bu öznitelikler bir sınıfta tanımlanır, bu nedenle belirli bir sınıfın her örneğinin aynı özniteliklere sahip olması beklenir.

Sınıf Paketleri: Davranış ve Durum

Bir sınıf, bir nesnenin davranışını ve durumunu bir araya toplamanıza izin verir. Daha iyi anlamak için aşağıdaki diyagramı izleyin -

Sınıf paketlerini tartışırken aşağıdaki noktalar dikkate değerdir:

  • Kelime behavior özdeş function - bir şey yapan (veya bir davranışı uygulayan) bir kod parçasıdır

  • Kelime state özdeş variables - bir sınıf içinde değerleri depolamak için bir yerdir.

  • Bir sınıf davranışı ve durumu birlikte ileri sürdüğümüzde, bu, bir sınıfın işlevleri ve değişkenleri paketlediği anlamına gelir.

Sınıfların yöntemleri ve nitelikleri vardır

Python'da, bir yöntem oluşturmak bir sınıf davranışını tanımlar. Yöntem kelimesi, bir sınıf içinde tanımlanan bir işleve verilen OOP adıdır. Özetlemek gerekirse -

  • Class functions - eşanlamlıdır methods

  • Class variables - eşanlamlıdır name attributes.

  • Class - tam davranışa sahip bir örnek için bir plan.

  • Object - sınıfın örneklerinden biri, sınıfta tanımlanan işlevselliği gerçekleştirir.

  • Type - örneğin ait olduğu sınıfı gösterir

  • Attribute - Herhangi bir nesne değeri: object.attribute

  • Method - sınıfta tanımlanan bir "çağrılabilir özellik"

Örneğin aşağıdaki kod parçasına bakın -

var = “Hello, John”
print( type (var)) # ‘str’> or <class 'str'>
print(var.upper()) # upper() method is called, HELLO, JOHN

Oluşturma ve Örnekleme

Aşağıdaki kod, ilk sınıfımızın ve ardından örneğimizin nasıl oluşturulacağını gösterir.

class MyClass(object):
   pass
# Create first instance of MyClass
this_obj = MyClass()
print(this_obj)
# Another instance of MyClass
that_obj = MyClass()
print (that_obj)

Burada adında bir sınıf oluşturduk MyClassve herhangi bir görev yapmayan. Argümanobject içinde MyClass sınıf, sınıf mirasını içerir ve sonraki bölümlerde tartışılacaktır. pass Yukarıdaki kodda bu bloğun boş olduğunu yani boş bir sınıf tanımı olduğunu belirtir.

Bir örnek oluşturalım this_obj nın-nin MyClass() sınıflayın ve gösterildiği gibi yazdırın -

<__main__.MyClass object at 0x03B08E10>
<__main__.MyClass object at 0x0369D390>

Burada bir örnek oluşturduk MyClass.Onaltılık kod, nesnenin depolandığı adresi ifade eder. Başka bir örnek başka bir adresi işaret ediyor.

Şimdi sınıfın içinde bir değişken tanımlayalım MyClass() ve aşağıdaki kodda gösterildiği gibi bu sınıfın örneğinden değişkeni alın -

class MyClass(object):
   var = 9

# Create first instance of MyClass
this_obj = MyClass()
print(this_obj.var)

# Another instance of MyClass

that_obj = MyClass()
print (that_obj.var)

Çıktı

Yukarıda verilen kodu çalıştırdığınızda aşağıdaki çıktıyı gözlemleyebilirsiniz -

9
9

Örnek, hangi sınıftan başlatıldığını bildiği için, bir örnekten bir öznitelik istendiğinde, örnek özniteliği ve sınıfı arar. Bu denirattribute lookup.

Örnek Yöntemleri

Bir sınıfta tanımlanan bir işleve a method.Bir örnek yöntemi, onu çağırmak için bir örnek gerektirir ve dekoratör gerektirmez. Bir örnek yöntemi oluştururken, ilk parametre her zamanself. Başka bir adla (self) diyebilsek de, bir adlandırma kuralı olduğu için self'i kullanmanız önerilir.

class MyClass(object):
   var = 9
   def firstM(self):
      print("hello, World")
obj = MyClass()
print(obj.var)
obj.firstM()

Çıktı

Yukarıda verilen kodu çalıştırdığınızda aşağıdaki çıktıyı gözlemleyebilirsiniz -

9
hello, World

Yukarıdaki programda, argüman olarak self olan bir metodu tanımladığımıza dikkat edin. Ancak, herhangi bir argüman beyan etmediğimiz için yöntemi çağıramayız.

class MyClass(object):
   def firstM(self):
      print("hello, World")
      print(self)
obj = MyClass()
obj.firstM()
print(obj)

Çıktı

Yukarıda verilen kodu çalıştırdığınızda aşağıdaki çıktıyı gözlemleyebilirsiniz -

hello, World
<__main__.MyClass object at 0x036A8E10>
<__main__.MyClass object at 0x036A8E10>

Kapsülleme

Kapsülleme, OOP'nin temellerinden biridir. OOP, aşağıdaki şekillerde geliştirici için avantajlı olan nesnenin dahili çalışmasının karmaşıklığını gizlememizi sağlar -

  • İçini bilmeden bir nesneyi kullanmayı basitleştirir ve anlamayı kolaylaştırır.

  • Herhangi bir değişiklik kolayca yönetilebilir.

Nesne yönelimli programlama, büyük ölçüde kapsüllemeye dayanır. Kapsülleme ve soyutlama terimleri (veri gizleme olarak da adlandırılır) genellikle eşanlamlılar olarak kullanılır. Soyutlama kapsülleme yoluyla elde edildiğinden, neredeyse eşanlamlıdırlar.

Kapsülleme, bize nesnenin bazı bileşenlerine erişimi kısıtlama mekanizmasını sağlar; bu, bir nesnenin iç temsilinin nesne tanımının dışından görülemeyeceği anlamına gelir. Bu verilere erişim genellikle özel yöntemlerle sağlanır -Getters ve Setters.

Bu veriler, örnek özniteliklerinde depolanır ve sınıfın dışındaki herhangi bir yerden değiştirilebilir. Güvenli hale getirmek için, bu verilere yalnızca örnek yöntemleri kullanılarak erişilmelidir. Doğrudan erişime izin verilmemelidir.

class MyClass(object):
   def setAge(self, num):
      self.age = num

   def getAge(self):
      return self.age

zack = MyClass()
zack.setAge(45)
print(zack.getAge())

zack.setAge("Fourty Five")
print(zack.getAge())

Çıktı

Yukarıda verilen kodu çalıştırdığınızda aşağıdaki çıktıyı gözlemleyebilirsiniz -

45
Fourty Five

Veriler yalnızca doğru ve geçerliyse, İstisna işleme yapıları kullanılarak depolanmalıdır. Yukarıda gördüğümüz gibi, setAge () yöntemine kullanıcı girdisinde herhangi bir kısıtlama yoktur. Bir dize, sayı veya liste olabilir. Bu nedenle, saklanmanın doğruluğundan emin olmak için yukarıdaki kodu kontrol etmemiz gerekir.

class MyClass(object):
   def setAge(self, num):
      self.age = num

   def getAge(self):
      return self.age
zack = MyClass()
zack.setAge(45)
print(zack.getAge())
zack.setAge("Fourty Five")
print(zack.getAge())

Init Yapıcı

__init__ yöntemi, bir sınıfın nesnesi somutlaştırıldığı anda dolaylı olarak çağrılır. Bu, nesneyi başlatacaktır.

x = MyClass()

Yukarıda gösterilen kod satırı yeni bir örnek oluşturacak ve bu nesneyi yerel değişken x'e atayacaktır.

Örnekleme işlemi, yani calling a class object, boş bir nesne oluşturur. Çoğu sınıf, belirli bir başlangıç ​​durumuna göre özelleştirilmiş örneklerle nesneler oluşturmayı sever. Bu nedenle, bir sınıf gösterildiği gibi '__init __ ()' adlı özel bir yöntem tanımlayabilir -

def __init__(self):
   self.data = []

Python, bu nesne için bazı başlangıç ​​değerleri ayarlayabilen veya somutlaştırmada gerekli bir rutini çalıştıran bir sınıf başlatıldığında ortaya çıkması gereken ek bir özniteliği tanımlamak için örnekleme sırasında __init__ öğesini çağırır. Dolayısıyla bu örnekte, yeni, başlatılmış bir örnek şu şekilde elde edilebilir:

x = MyClass()

__İnit __ () yöntemi, daha fazla esneklik için tek veya birden çok argümana sahip olabilir. İnit, örneğin özniteliklerini başlattığı için başlatma anlamına gelir. Bir sınıfın kurucusu denir.

class myclass(object):
   def __init__(self,aaa, bbb):
      self.a = aaa
      self.b = bbb

x = myclass(4.5, 3)
print(x.a, x.b)

Çıktı

4.5 3

Sınıf Özellikleri

Sınıfta tanımlanan özniteliğe "sınıf öznitelikleri" ve işlevde tanımlanan özniteliklere "örnek öznitelikleri" adı verilir. Tanımlanırken, bunlar belirli bir örneğin değil, sınıfın özelliğidir, çünkü bu öznitelikler self önekine sahip değildir.

Sınıf özniteliklerine, sınıfın kendisi (className.attributeName) yanı sıra sınıfın örnekleri (inst.attributeName) tarafından erişilebilir. Dolayısıyla, örnekler hem örnek özniteliğine hem de sınıf özniteliklerine erişebilir.

>>> class myclass():
   age = 21
>>> myclass.age
21
>>> x = myclass()
>>> x.age
21
>>>

Kapsüllemeyi bozmak için iyi bir yöntem olmasa da, bir örnekte bir sınıf özelliği geçersiz kılınabilir.

Python'da öznitelikler için bir arama yolu vardır. İlki, sınıf içinde tanımlanan yöntem ve daha sonra onun üzerindeki sınıftır.

>>> class myclass(object):
   classy = 'class value'
>>> dd = myclass()
>>> print (dd.classy) # This should return the string 'class value'
class value
>>>
>>> dd.classy = "Instance Value"
>>> print(dd.classy) # Return the string "Instance Value"
Instance Value
>>>
>>> # This will delete the value set for 'dd.classy' in the instance.
>>> del dd.classy
>>> >>> # Since the overriding attribute was deleted, this will print 'class
value'.

>>> print(dd.classy)
class value
>>>

Dd örneğindeki 'klas' sınıf özniteliğini geçersiz kılıyoruz. Geçersiz kılındığında, Python yorumlayıcısı geçersiz kılınan değeri okur. Ancak yeni değer 'del' ile silindiğinde, geçersiz kılınan değer artık örnekte mevcut değildir ve bu nedenle arama bir seviyenin üstüne çıkar ve bunu sınıftan alır.

Sınıf ve Örnek Verileriyle Çalışma

Bu bölümde, sınıf verilerinin örnek verileriyle nasıl ilişkili olduğunu anlayalım. Verileri bir sınıfta veya bir örnekte saklayabiliriz. Bir sınıf tasarladığımızda, hangi verilerin örneğe ait olduğuna ve hangi verilerin genel sınıfta depolanması gerektiğine karar veririz.

Bir örnek, sınıf verilerine erişebilir. Birden fazla örnek oluşturursak, bu örnekler kendi öznitelik değerlerine ve genel sınıf verilerine erişebilir.

Bu nedenle, bir sınıf verisi, tüm örnekler arasında paylaşılan verilerdir. Daha iyi anlaşılması için aşağıda verilen kodu inceleyin -

class InstanceCounter(object):
   count = 0 # class attribute, will be accessible to all instances
   def __init__(self, val):
      self.val = val
      InstanceCounter.count +=1 # Increment the value of class attribute, accessible through class name
# In above line, class ('InstanceCounter') act as an object
   def set_val(self, newval):
      self.val = newval

   def get_val(self):
      return self.val

   def get_count(self):
      return InstanceCounter.count
a = InstanceCounter(9)
b = InstanceCounter(18)
c = InstanceCounter(27)

for obj in (a, b, c):
   print ('val of obj: %s' %(obj.get_val())) # Initialized value ( 9, 18, 27)
   print ('count: %s' %(obj.get_count())) # always 3

Çıktı

val of obj: 9
count: 3
val of obj: 18
count: 3
val of obj: 27
count: 3

Kısacası, sınıf öznitelikleri tüm sınıf örnekleri için aynı iken, örnek öznitelikleri her örnek için özeldir. İki farklı örnek için iki farklı örnek özelliğimiz olacak.

class myClass:
   class_attribute = 99

   def class_method(self):
      self.instance_attribute = 'I am instance attribute'

print (myClass.__dict__)

Çıktı

Yukarıda verilen kodu çalıştırdığınızda aşağıdaki çıktıyı gözlemleyebilirsiniz -

{'__module__': '__main__', 'class_attribute': 99, 'class_method': 
      
       , '__dict__': 
       
        , '__weakref__': 
        
         , '__doc__': None} 
        
       
      

The instance attribute myClass.__dict__ as shown −

>>> a = myClass()
>>> a.class_method()
>>> print(a.__dict__)
{'instance_attribute': 'I am instance attribute'}