Дані екземпляра та класу

Об'єктноорієнтоване програмування в Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Основи ООП

 

Наслідування:

  • Розширення функціональності наявного коду

Поліморфізм:

  • Єдиний інтерфейс для різних реалізацій

Інкапсуляція:

  • Об'єднання даних і методів
Об'єктноорієнтоване програмування в Python

Дані на рівні екземпляра

class Employee:
    def __init__(self, name, salary):
       self.name = name
       self.salary = salary

emp1 = Employee("Teo Mille", 50000) 
emp2 = Employee("Marta Popov", 65000)
  • name, salary — це атрибути екземпляра
  • self прив'язується до екземпляра
Об'єктноорієнтоване програмування в Python

Дані на рівні класу

  • Дані, спільні для всіх екземплярів класу
  • Атрибути класу оголошуйте в тілі class
class MyClass:
    # Визначаємо атрибут класу
    CLASS_ATTR_NAME = attr_value


  • «Глобальна змінна» всередині класу
Об'єктноорієнтоване програмування в Python

Дані на рівні класу

class Employee:
  # Define a class attribute
  MIN_SALARY = 30000    #<--- no self. 

def __init__(self, name, salary): self.name = name # Use class name to access class attribute if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY спільний для всіх екземплярів
  • Не використовуйте self для оголошення атрибуту класу
  • використовуйте ClassName.ATTR_NAME для доступу до значення атрибуту класу
Об'єктноорієнтоване програмування в Python

Дані на рівні класу

class Employee:
  # Define a class attribute
  MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # Use class name to access class attribute if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
emp1 = Employee("TBD", 40000)
print(emp1.MIN_SALARY)
30000
emp2 = Employee("TBD", 60000)
print(emp2.MIN_SALARY)
30000
Об'єктноорієнтоване програмування в Python

Навіщо атрибути класу?

Глобальні константи, пов'язані з класом

 

  • мінімальні/максимальні значення атрибутів
  • типові значення та константи, напр., pi для класу Circle
  • ...
Об'єктноорієнтоване програмування в Python

Методи класу

  • Методи вже «спільні»: той самий код для кожного екземпляра
  • Методи класу не можуть використовувати дані рівня екземпляра
class MyClass:

  @classmethod                         # <---use decorator to declare a class method

def my_awesome_method(cls, args...): # <---cls argument refers to the class # Do stuff here # Can't use any instance attributes :(
MyClass.my_awesome_method(args...)
Об'єктноорієнтоване програмування в Python

Альтернативні конструктори

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY
  • Може бути лише один __init__()

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)

  • Використовуйте методи класу для створення об'єктів
  • Використайте return, щоб повернути об'єкт
  • cls(...) викликає __init__(...)
Об'єктноорієнтоване програмування в Python

Альтернативні конструктори

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)        

текстовий файл з одним рядком — ім'я співробітника

# Створіть співробітника без прямого виклику Employee()
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Об'єктноорієнтоване програмування в Python

Давайте потренуємось!

Об'єктноорієнтоване програмування в Python

Preparing Video For Download...