Заняття - це стовп об'єктно-орієнтованого програмування . OOP сильно переймається організацією коду, повторним використанням та інкапсуляцією.
По-перше, відмова від відповідальності: OOP частково на відміну від функціонального програмування , що є різною парадигмою, яка багато використовується в Python. Не всі, хто програмує на Python (або, мабуть, більшість мов), використовує OOP. Ви можете багато зробити в Java 8, що не дуже об’єктно-орієнтоване. Якщо ви не хочете використовувати OOP, не робіть цього. Якщо ви просто пишете одноразові сценарії для обробки даних, які більше ніколи не використовуєте, продовжуйте писати так, як ви є.
Однак є маса причин використовувати OOP.
Деякі причини:
Організація: OOP визначає добре відомі та стандартні способи опису та визначення даних і процедур у коді. І дані, і процедура можуть зберігатися на різних рівнях визначення (у різних класах), і є стандартні способи говорити про ці визначення. Тобто, якщо ви використовуєте OOP стандартним способом, це допоможе вашому пізніше самому та іншим зрозуміти, редагувати та використовувати ваш код. Крім того, замість того, щоб використовувати складний, довільний механізм зберігання даних (дикти диктів чи списків або дикти або списки диктовок наборів, чи будь-що інше), ви можете називати фрагменти структур даних і зручно посилатися на них.
Штат: OOP допомагає визначити та відстежувати стан. Наприклад, у класичному прикладі, якщо ви створюєте програму, яка обробляє учнів (наприклад, програму оцінок), ви можете зберігати всю необхідну інформацію про них в одному місці (ім'я, вік, стать, рівень, курси, оцінки, викладачі, однолітки, дієта, особливі потреби тощо), і ці дані зберігаються до тих пір, поки об’єкт живий і легко доступний.
Інкапсуляція : при інкапсуляції процедура та дані зберігаються разом. Методи (термін OOP для функцій) визначаються прямо поряд із даними, над якими вони працюють та виробляють. У такій мові, як Java, яка дозволяє контролювати доступ , або в Python, залежно від того, як ви описуєте свій публічний API, це означає, що методи та дані можуть бути приховані від користувача. Це означає, що якщо вам потрібно або хочете змінити код, ви можете робити все, що завгодно, щоб реалізувати код, але зберігати загальнодоступні API-інтерфейси однаковими.
Спадщина : Спадкування дозволяє визначити дані та процедуру в одному місці (в одному класі), а потім переозначити або розширити цю функціональність пізніше. Наприклад, у Python я часто бачу людей, які створюють підкласи dict
класу, щоб додати додаткову функціональність. Загальна зміна - це метод, який видає виняток, коли ключ запитується зі словника, який не існує, щоб дати значення за замовчуванням на основі невідомого ключа. Це дозволяє розширити власний код зараз або пізніше, дозволити іншим розширити ваш код і дозволяє розширити код інших людей.
Повторність використання: Усі ці причини та інші дозволяють збільшити повторне використання коду. Об'єктно-орієнтований код дозволяє один раз написати твердий (перевірений) код, а потім повторно використовувати знову і знову. Якщо вам потрібно щось налаштувати для конкретного випадку використання, ви можете успадкувати існуючий клас і замінити наявну поведінку. Якщо вам потрібно щось змінити, ви можете все це змінити, зберігаючи існуючі підписи публічного методу, і ніхто не мудріший (сподіваємось).
Знову ж таки, є кілька причин не використовувати OOP, і вам цього не потрібно. Але на щастя з такою мовою, як Python, ви можете використовувати трохи або багато, це вирішувати вам.
Приклад випадку використання студентом (немає гарантії на якість коду, лише приклад):
Об'єктно-орієнтована
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())
Стандартний дікт
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]))