Instantie- en klassegegevens

Objectgeoriënteerd programmeren in Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Kernprincipes van OOP

 

Overerving:

  • Functionaliteit van bestaande code uitbreiden

Polymorfisme:

  • Een uniforme interface creëren

Encapsulatie:

  • Bundelen van data en methoden
Objectgeoriënteerd programmeren in Python

Instantie-niveau gegevens

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 zijn instantie-attributen
  • self bindt aan een instantie
Objectgeoriënteerd programmeren in Python

Klasse-niveau gegevens

  • Gegevens gedeeld door alle instanties van een klasse
  • Definieer klasse-attributen in de body van class
class MyClass:
    # Definieer een klasse-attribuut
    CLASS_ATTR_NAME = attr_value


  • "Globale variabele" binnen de klasse
Objectgeoriënteerd programmeren in Python

Klasse-niveau gegevens

class Employee:
  # Definieer een klasse-attribuut
  MIN_SALARY = 30000    #<--- geen self. 

def __init__(self, name, salary): self.name = name # Gebruik de klassennaam om het klasse-attribuut te benaderen if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY wordt gedeeld door alle instanties
  • Gebruik geen self om een klasse-attribuut te definiëren
  • gebruik ClassName.ATTR_NAME om de waarde van het klasse-attribuut te benaderen
Objectgeoriënteerd programmeren in Python

Klasse-niveau gegevens

class Employee:
  # Definieer een klasse-attribuut
  MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # Gebruik de klassennaam om het klasse-attribuut te benaderen 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
Objectgeoriënteerd programmeren in Python

Waarom klasse-attributen gebruiken?

Globale constanten gerelateerd aan de klasse

 

  • minimale/maximale waarden voor attributen
  • vaak gebruikte waarden en constanten, bijv. pi voor een Circle klasse
  • ...
Objectgeoriënteerd programmeren in Python

Klasse-methoden

  • Methoden zijn al "gedeeld": dezelfde code voor elke instantie
  • Klasse-methoden kunnen geen instantie-niveau gegevens gebruiken
class MyClass:

  @classmethod                         # <---gebruik decorator om een klasse-methode te declareren

def my_awesome_method(cls, args...): # <---cls argument verwijst naar de klasse # Doe hier dingen # Kan geen instantie-attributen gebruiken :(
MyClass.my_awesome_method(args...)
Objectgeoriënteerd programmeren in Python

Alternatieve constructors

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
  • Kan slechts één __init__() hebben

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

  • Gebruik klasse-methoden om objecten te maken
  • Gebruik return om een object terug te geven
  • cls(...) roept __init__(...) aan
Objectgeoriënteerd programmeren in Python

Alternatieve constructors

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)        

tekstbestand met één regel met de naam van de werknemer

# Maak een werknemer zonder Employee() aan te roepen
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Objectgeoriënteerd programmeren in Python

Laten we oefenen!

Objectgeoriënteerd programmeren in Python

Preparing Video For Download...