Данные экземпляра и класса

Объектно-ориентированное программирование на 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:
    # Define a class attribute
    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)        

текстовый файл с одной строкой, содержащей имя сотрудника

# Create an employee without calling Employee()
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Объектно-ориентированное программирование на Python

Давайте потренируемся!

Объектно-ориентированное программирование на Python

Preparing Video For Download...