Instanz- und Klassendaten

Objektorientierte Programmierung in Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Kernprinzipien der OOP

 

Vererbung:

  • Funktionalität von bestehendem Code erweitern

Polymorphismus:

  • Einheitliche Schnittstelle schaffen

Kapselung:

  • Daten und Methoden bündeln
Objektorientierte Programmierung in Python

Instanzdaten

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 sind Instanzattribute
  • self bindet an eine Instanz
Objektorientierte Programmierung in Python

Klassendaten

  • Daten, die unter allen Instanzen einer Klasse geteilt werden
  • Klassenattribute im Rumpf der class definieren
class MyClass:
    # Definiere ein Klassenattribut
    CLASS_ATTR_NAME = attr_value


  • "Globale Variable" innerhalb der Klasse
Objektorientierte Programmierung in Python

Klassendaten

class Employee:
  # Definiere ein Klassenattribut
  MIN_SALARY = 30000    #<--- kein self. 

def __init__(self, name, salary): self.name = name # Verwende den Klassennamen, um auf das Klassenattribut zuzugreifen if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY wird unter allen Instanzen geteilt
  • Verwende nicht self, um ein Klassenattribut zu definieren
  • Verwende ClassName.ATTR_NAME, um den Wert des Klassenattributs zu zugreifen
Objektorientierte Programmierung in Python

Klassendaten

class Employee:
  # Definiere ein Klassenattribut
  MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # Verwende den Klassennamen, um auf das Klassenattribut zuzugreifen 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
Objektorientierte Programmierung in Python

Warum Klassenattribute verwenden?

Globale Konstanten für die Klasse

 

  • minimale/maximale Werte für Attribute
  • häufig verwendete Werte und Konstanten, z.B. pi für eine Circle-Klasse
  • ...
Objektorientierte Programmierung in Python

Klassenmethoden

  • Methoden sind bereits "geteilt": gleicher Code für jede Instanz
  • Klassenmethoden können keine Instanzdaten verwenden
class MyClass:

  @classmethod                         # <---Dekorator für Klassenmethode

def my_awesome_method(cls, args...): # <---cls-Argument bezieht sich auf die Klasse # Hier etwas tun # Keine Instanzattribute verwenden :(
MyClass.my_awesome_method(args...)
Objektorientierte Programmierung in Python

Alternative Konstruktoren

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
  • Nur ein __init__() möglich

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

  • Klassenmethoden zur Objekterstellung nutzen
  • return gibt ein Objekt zurück
  • cls(...) ruft __init__(...) auf
Objektorientierte Programmierung in Python

Alternative Konstruktoren

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)        

Textdatei mit einer Zeile, die den Namen des Mitarbeiters enthält

# Erstelle einen Mitarbeiter ohne Employee() aufzurufen
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Objektorientierte Programmierung in Python

Lass uns üben!

Objektorientierte Programmierung in Python

Preparing Video For Download...