Sınıflar, Nesneye Yönelik Programlamanın temel direğidir . OOP, kod organizasyonu, yeniden kullanılabilirlik ve kapsülleme ile son derece ilgilidir.
İlk olarak, bir feragatname: OOP kısmen Fonksiyonel Programlama'nın aksine Python'da çok kullanılan farklı bir paradigma olan . Python'da (veya elbette çoğu dilde) program yapan herkes OOP kullanmaz. Java 8'de çok Nesneye Dayalı olmayan çok şey yapabilirsiniz. OOP kullanmak istemiyorsanız, kullanmayın. Bir daha asla kullanmayacağınız verileri işlemek için tek seferlik komut dosyaları yazıyorsanız, istediğiniz gibi yazmaya devam edin.
Bununla birlikte, OOP kullanmak için birçok neden vardır.
Bazı nedenler:
Organizasyon: OOP, koddaki hem verileri hem de prosedürü tanımlamanın ve tanımlamanın iyi bilinen ve standart yollarını tanımlar. Hem veriler hem de prosedürler farklı tanım seviyelerinde (farklı sınıflarda) saklanabilir ve bu tanımlar hakkında konuşmak için standart yollar vardır. Yani, OOP'yi standart bir şekilde kullanırsanız, daha sonra kendinizin ve başkalarının kodunuzu anlamasına, düzenlemesine ve kullanmasına yardımcı olur. Ayrıca, karmaşık, keyfi bir veri depolama mekanizması (dikte veya liste dikleri veya dikte veya set dikleri listesi veya herhangi bir şey) kullanmak yerine, veri yapılarının parçalarını adlandırabilir ve bunlara rahatça başvurabilirsiniz.
Durum: OOP, durumu tanımlamanıza ve takip etmenize yardımcı olur. Örneğin, klasik bir örnekte, öğrencileri işleyen bir program oluşturuyorsanız (örneğin, bir not programı), onlar hakkında ihtiyacınız olan tüm bilgileri tek bir yerde (ad, yaş, cinsiyet, sınıf seviyesi, dersler, notlar, öğretmenler, akranlar, diyet, özel ihtiyaçlar, vb.) ve nesne canlı olduğu ve kolayca erişilebilir olduğu sürece bu veriler devam eder.
Kapsülleme : Kapsülleme ile prosedür ve veriler birlikte saklanır. Yöntemler (işlevler için bir OOP terimi), üzerinde çalıştıkları ve ürettikleri verilerin yanında tanımlanır. Erişim kontrolüne izin veren Java gibi bir dilde veya genel API'nizi nasıl tanımladığınıza bağlı olarak Python'da, bu yöntem ve verilerin kullanıcıdan gizlenebileceği anlamına gelir. Bunun anlamı, koda ihtiyacınız varsa veya değiştirmek istiyorsanız, kodun uygulanması için ne isterseniz yapabilirsiniz, ancak genel API'leri aynı tutabilirsiniz.
Kalıtım : Kalıtım, verileri ve prosedürü tek bir yerde (bir sınıfta) tanımlamanıza ve daha sonra bu işlevselliği geçersiz kılmanıza veya genişletmenize olanak tanır. Örneğin, Python'da sık sık dict
ek işlevler eklemek için insanların sınıfın alt sınıflarını oluşturduğunu görüyorum . Bilinmeyen bir anahtara göre varsayılan bir değer vermek için var olmayan bir sözlükten bir anahtar istendiğinde, ortak bir değişiklik kural dışı durum atan yöntemi geçersiz kılar. Bu, şimdi veya daha sonra kendi kodunuzu genişletmenize, başkalarının kodunuzu genişletmesine izin verir ve diğer kişilerin kodunu genişletmenize izin verir.
Yeniden kullanılabilirlik: Tüm bu nedenler ve diğerleri, kodun daha fazla yeniden kullanılabilirliğine izin verir. Nesneye yönelik kod, katı (test edilmiş) kodu bir kez yazmanıza ve ardından tekrar tekrar kullanmanıza olanak tanır. Özel kullanım durumunuz için bir şey yapmanız gerekiyorsa, mevcut bir sınıftan devralınabilir ve mevcut davranışın üzerine yazabilirsiniz. Bir şeyi değiştirmeniz gerekiyorsa, mevcut genel yöntem imzalarını korurken hepsini değiştirebilirsiniz ve kimse daha akıllı değildir (umarım).
Yine, OOP'yi kullanmamanın birkaç nedeni var ve buna gerek yok. Ama neyse ki Python gibi bir dille, sadece biraz veya çok kullanabilirsiniz, size kalmış.
Öğrenci kullanım örneği (kod kalitesi garantisi yok, sadece bir örnek):
Nesne odaklı
class Student(object):
def __init__(self, name, age, gender, level, grades=None):
self.name = name
self.age = age
self.gender = gender
self.level = level
self.grades = grades or {}
def setGrade(self, course, grade):
self.grades[course] = grade
def getGrade(self, course):
return self.grades[course]
def getGPA(self):
return sum(self.grades.values())/len(self.grades)
# Define some students
john = Student("John", 12, "male", 6, {"math":3.3})
jane = Student("Jane", 12, "female", 6, {"math":3.5})
# Now we can get to the grades easily
print(john.getGPA())
print(jane.getGPA())
Standart Dict
def calculateGPA(gradeDict):
return sum(gradeDict.values())/len(gradeDict)
students = {}
# We can set the keys to variables so we might minimize typos
name, age, gender, level, grades = "name", "age", "gender", "level", "grades"
john, jane = "john", "jane"
math = "math"
students[john] = {}
students[john][age] = 12
students[john][gender] = "male"
students[john][level] = 6
students[john][grades] = {math:3.3}
students[jane] = {}
students[jane][age] = 12
students[jane][gender] = "female"
students[jane][level] = 6
students[jane][grades] = {math:3.5}
# At this point, we need to remember who the students are and where the grades are stored. Not a huge deal, but avoided by OOP.
print(calculateGPA(students[john][grades]))
print(calculateGPA(students[jane][grades]))