Instans- och klassdata

Objektorienterad programmering i Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Grundprinciper inom OOP

 

Arv:

  • Utökar funktionaliteten i befintlig kod

Polymorfism:

  • Skapar ett enhetligt gränssnitt

Inkapsling:

  • Sammanslagning av data och metoder
Objektorienterad programmering i Python

Data på instansnivå

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 är instansattribut
  • self binds till en instans
Objektorienterad programmering i Python

Data på klassnivå

  • Data som delas mellan alla instanser av en klass
  • Definiera klassattribut i kroppen av class
class MyClass:
    # Define a class attribute
    CLASS_ATTR_NAME = attr_value


  • "Global variabel" inom klassen
Objektorienterad programmering i Python

Data på klassnivå

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 delas mellan alla instanser
  • Använd inte self för att definiera klassattribut
  • Använd ClassName.ATTR_NAME för att komma åt klassattributets värde
Objektorienterad programmering i Python

Data på klassnivå

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
Objektorienterad programmering i Python

Varför använda klassattribut?

Globala konstanter kopplade till klassen

 

  • minimi-/maximivärden för attribut
  • vanligt förekommande värden och konstanter, t.ex. pi för en Circle-klass
  • ...
Objektorienterad programmering i Python

Klassmetoder

  • Metoder är redan "delade": samma kod för varje instans
  • Klassmetoder kan inte använda data på instansnivå
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...)
Objektorienterad programmering i Python

Alternativa konstruktorer

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 bara ha en __init__()

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

  • Använd klassmetoder för att skapa objekt
  • Använd return för att returnera ett objekt
  • cls(...) anropar __init__(...)
Objektorienterad programmering i Python

Alternativa konstruktorer

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)        

textfil med en rad innehållande den anställdes namn

# Create an employee without calling Employee()
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Objektorienterad programmering i Python

Nu kör vi en övning!

Objektorienterad programmering i Python

Preparing Video For Download...