Objekte und OO-Programmierung¶

# Ausgangslage
employees = {
    "name 1": {
        "salary": ...,
        "skills": [...],
    },
    "name 2": {
        "salary": ...,
        "skills": [...],
    },
    ...
}
In [ ]:
class Employee:
    name = "Unknown"
    gehalt = 0
    skills = []

employee1 = Employee()
print(employee1.name)
print(employee1.gehalt)
print(employee1.skills)

employee2 = Employee()
print(employee2.name)
print(employee2.gehalt)
print(employee2.skills)
Unknown
0
[]
Unknown
0
[]
In [ ]:
employee1.name = "Joe Doe"
print(employee1.name)
print(employee2.name)
Joe Doe
Unknown
In [ ]:
class Employee:
    def __init__(self):
        print("Init!")
    
employee3 = Employee()
Init!
In [ ]:
class Employee:
    def __init__(self, name="", gehalt=0, skills=[]):
        self.name = name
        self.gehalt = gehalt

        if skills is None:
            self.skills = []
        else:
            self.skills = skills

employee4 = Employee("Joe Doe", 2000, [])
print(type(employee4))
print(employee4.name)
print(employee4.gehalt)
print(employee4.skills)#

employee5 = Employee("Jane Oh", 3000, ["marketing"])
print(employee5.name)
print(employee5.gehalt)
print(employee5.skills)

# Geht nicht, weil die Klasse kein Attribut "name" definiert
#print(Employee.name)
<class '__main__.Employee'>
Joe Doe
2000
[]
Jane Oh
3000
['marketing']
In [ ]:
employee6 = Employee()
print(employee6.name)
print(employee6.gehalt)
print(employee6.skills)
0
[]
In [ ]:
class Employee:
    def __init__(self, name="", gehalt=0, skills=[]):
        self.name = name
        self.gehalt = gehalt

        if skills is None:
            self.skills = []
        else:
            self.skills = skills

    def __str__(self):
        s  = [f"Employee '{self.name}'"]
        s.append(f"    gehalt: {self.gehalt}")
        s.append(f"    skills:")
        for skill in self.skills:
            s.append(f"        - {skill}")
        return "\n".join(s)

"""
Employee 'name':
    gehalt: XXX
    skills:
        - skill 1
        - skill 2
"""
employee7 = Employee(name="Bob Smith", skills=["software development", "it support"])
print(employee7)
Employee 'Bob Smith'
    gehalt: 0
    skills:
        - software development
        - it support
In [ ]:
# Exkurs: Strings und `format()`

s = "Hallo, {}"
print(s.format("Welt"))

s = "{}, {}"
print(s.format("Guten Tag", "Welt"))

s = "{name}, {grussformel}"
print(s.format(grussformel="Guten Tag", name="Welt"))

grussformel="Guten Tag"
name="Welt"
print(f"{name}, {grussformel}")


def sagehallo(name):
    # 'grussformel' ist eine globale variable!
    print(f"{grussformel}, {name}")

sagehallo("Welt")
Hallo, Welt
Guten Tag, Welt
Welt, Guten Tag
Welt, Guten Tag
Guten Tag, Welt
In [ ]:
class Employee:
    def __init__(self, name="", gehalt=0, skills=[]):
        self.name = name
        self.gehalt = gehalt

        if skills is None:
            self.skills = []
        else:
            self.skills = skills

    def set_gehalt(self, neues_gehalt):
        if not isinstance(neues_gehalt, int):
            raise TypeError("gehalt muss ein Integer sein")
        if neues_gehalt < 4000:
            self.gehalt = neues_gehalt
        else:
            raise ValueError("Zu hohes gehalt!")

employee8 = Employee()
# Ok
employee8.gehalt = 5000
print(employee8.gehalt)
# ValueError!
employee8.set_gehalt(4000)
# TypeError!
employee8.set_gehalt("ein sack mehl")
5000
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/chris/work/python-kurs-softed/notebooks/objects.ipynb Cell 10 line 2
     <a href='vscode-notebook-cell:/home/chris/work/python-kurs-softed/notebooks/objects.ipynb#X12sZmlsZQ%3D%3D?line=21'>22</a> print(employee8.gehalt)
     <a href='vscode-notebook-cell:/home/chris/work/python-kurs-softed/notebooks/objects.ipynb#X12sZmlsZQ%3D%3D?line=22'>23</a> # ValueError!
---> <a href='vscode-notebook-cell:/home/chris/work/python-kurs-softed/notebooks/objects.ipynb#X12sZmlsZQ%3D%3D?line=23'>24</a> employee8.set_gehalt(4000)
     <a href='vscode-notebook-cell:/home/chris/work/python-kurs-softed/notebooks/objects.ipynb#X12sZmlsZQ%3D%3D?line=24'>25</a> # TypeError!
     <a href='vscode-notebook-cell:/home/chris/work/python-kurs-softed/notebooks/objects.ipynb#X12sZmlsZQ%3D%3D?line=25'>26</a> employee8.set_gehalt("ein sack mehl")

/home/chris/work/python-kurs-softed/notebooks/objects.ipynb Cell 10 line 1
     <a href='vscode-notebook-cell:/home/chris/work/python-kurs-softed/notebooks/objects.ipynb#X12sZmlsZQ%3D%3D?line=14'>15</a>     self.gehalt = neues_gehalt
     <a href='vscode-notebook-cell:/home/chris/work/python-kurs-softed/notebooks/objects.ipynb#X12sZmlsZQ%3D%3D?line=15'>16</a> else:
---> <a href='vscode-notebook-cell:/home/chris/work/python-kurs-softed/notebooks/objects.ipynb#X12sZmlsZQ%3D%3D?line=16'>17</a>     raise ValueError("Zu hohes gehalt!")

ValueError: Zu hohes gehalt!