Date de instanță și de clasă

Programare orientată pe obiecte în Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Principii fundamentale ale POO

 

Moștenire:

  • Extinderea funcționalității codului existent

Polimorfism:

  • Crearea unei interfețe unificate

Încapsulare:

  • Gruparea datelor și a metodelor
Programare orientată pe obiecte în Python

Date la nivel de instanță

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 sunt atribute de instanță
  • self se leagă de o instanță
Programare orientată pe obiecte în Python

Date la nivel de clasă

  • Date partajate între toate instanțele unei clase
  • Definiți atributele de clasă în corpul clasei class
class MyClass:
    # Define a class attribute
    CLASS_ATTR_NAME = attr_value


  • „Variabilă globală" în cadrul clasei
Programare orientată pe obiecte în Python

Date la nivel de clasă

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 este partajat între toate instanțele
  • Nu utilizați self pentru a defini atributul de clasă
  • utilizați ClassName.ATTR_NAME pentru a accesa valoarea atributului de clasă
Programare orientată pe obiecte în Python

Date la nivel de clasă

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
Programare orientată pe obiecte în Python

De ce să utilizați atribute de clasă?

Constante globale legate de clasă

 

  • valori minime/maxime pentru atribute
  • valori și constante frecvent utilizate, ex. pi pentru o clasă Circle
  • ...
Programare orientată pe obiecte în Python

Metode de clasă

  • Metodele sunt deja „partajate": același cod pentru fiecare instanță
  • Metodele de clasă nu pot utiliza date la nivel de instanță
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...)
Programare orientată pe obiecte în Python

Constructori alternativi

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
  • Poate exista doar un singur __init__()

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

  • Utilizați metode de clasă pentru a crea obiecte
  • Utilizați return pentru a returna un obiect
  • cls(...) va apela __init__(...)
Programare orientată pe obiecte în Python

Constructori alternativi

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)        

fișier text cu o singură linie conținând numele angajatului

# Create an employee without calling Employee()
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Programare orientată pe obiecte în Python

Să exersăm!

Programare orientată pe obiecte în Python

Preparing Video For Download...