Skip to content
Snippets Groups Projects
Commit 8ae4ea5d authored by Christof Kaufmann's avatar Christof Kaufmann
Browse files

Notebooks from ckaufmann/akis-python-framework@bcf3afa1

parent b3c37093
Branches
No related tags found
No related merge requests found
%% Cell type:markdown id:0003-9a3628a837018c225604d1c628c5184027add4746538009153a9c344cf4 tags:
# Aufgabentitel
Aufgabentext
## Lösung
Lösungstext
%% Cell type:code id:0004-bb9aa6dbcf892a1ba8ff1a906fcbf1cd3dfdb268b6eb304e429d9b3195f tags:
```
def optional_code():
pass
```
%% Cell type:markdown id:0005-bf9a214c6719669e091472d3810ac608eaec73be2b0ad122a7c8daf2369 tags:
Um die Lösung zu testen folgen verschiedene Tests. Zuerst ein Test mit …
%% Cell type:code id:0006-bbb5ffe10d224d47126a2e25fa2db60da837e6bc0c8cc4c538e7e95e89e tags:
```
optional_code()
```
%% Cell type:markdown id:0002-50450c9cb1f2fa0ccce01df2eadf4fffa33ed7d251b5ea0ced148dedf47 tags:
# Aufgabentitel
Aufgabentext
Hier Ihr Code:
%% Cell type:code id:0003-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
%% Cell type:markdown id:0004-bf9a214c6719669e091472d3810ac608eaec73be2b0ad122a7c8daf2369 tags:
Um die Lösung zu testen folgen verschiedene Tests. Zuerst ein Test mit …
%% Cell type:code id:0005-bbb5ffe10d224d47126a2e25fa2db60da837e6bc0c8cc4c538e7e95e89e tags:
```
optional_code()
```
%% Cell type:markdown id:0003-cb377ac6c9337668d8ae96ba18b7835ed31956700b972c54cf9eb85ca52 tags:
# Kontrolle über den Datenzugriff
Als Start-Code ist eine Klasse `Buch` gegeben, die Sie fertig stellen
sollen. Das Buch soll einen `preis` und eine `anzahl` als Attribute
haben. Implementieren Sie die Klasse unter Verwendung des Decorators
`property`, um Getter und Setter für die Attribute bereitzustellen.
Dabei ist das Attribut `preis` nach der Erzeugung nur lesbar. Es muss
über den Konstruktor allerdings positiv gesetzt werden, andernfalls soll
ein `ValueError` mit der Nachricht `'Preis kann nicht negativ sein.'`
geworfen werden. Das Attribut `anzahl` darf zwar verändert werden, aber
nicht kleiner als Null, sonst soll analog ein `ValueError` mit der
Nachricht `'Anzahl kann nicht negativ sein.'` geworfen werden.
## Lösung
Die Getter- und Setter-Methoden für die Attribute wurden mit dem
Decorator `@property` und `@anzahl.setter` erstellt. Die Konvention in
Python ist es, Attribute, die als privat betrachtet werden sollen, mit
einem führenden Unterstrich zu versehen. Die Setter-Methode für
`_anzahl` verhindert, dass ein negativer Wert gesetzt wird. Den Code
dafür, muss man im Konstruktor nicht wiederholen, sondern kann einfach
den Setter benutzen, indem man anstatt `self._anzahl = anzahl` einfach
`self.anzahl = anzahl` benutzt.
%% Cell type:code id:0004-294a854c82cddd745391eb17ea9d4d244152c9e8c84b99360b623b8f487 tags:
```
class Buch:
def __init__(self, preis, anzahl):
if preis < 0:
raise ValueError('Preis kann nicht negativ sein.')
self._preis = preis
self.anzahl = anzahl
@property
def preis(self):
return self._preis
@property
def anzahl(self):
return self._anzahl
@anzahl.setter
def anzahl(self, anzahl):
if anzahl < 0:
raise ValueError('Anzahl kann nicht negativ sein.')
self._anzahl = anzahl
```
%% Cell type:markdown id:0005-cf00cd80436b27340dba473e7ae66d421eef75dc49d769ae0f3ac96193f tags:
Wir erstellen zunächst ein gültiges `Buch`:
%% Cell type:code id:0006-41e78a81f1424e9bb6cf719a54a6363701b394864d7f065388b86fe3212 tags:
```
b = Buch(9.99, 15)
```
%% Cell type:markdown id:0007-af5102a1f8f873fb9009623cd5688108809b7244d3d6e2a25a0fffdfbde tags:
Und testen das Attribut `preis`, das man zwar lesen, aber nicht
schreiben können soll:
%% Cell type:code id:0008-ba71ff1a670e3e872245ea74948ccc3e6962a563c42264cca3367e20ced tags:
```
b.preis
```
%% Output
9.99
%% Cell type:code id:0009-7d33c4c17ffca48b4651a94d434eaddbb627d32bdb2191d2e8b77fdede2 tags:
```
b.preis = 10
```
%% Output
Traceback (most recent call last):
AttributeError: property 'preis' of 'Buch' object has no setter
%% Cell type:markdown id:0010-5ff74a728df6d5369f95c02f2d9a626d018c8b488d483209c12059b37dd tags:
Ein Buch mit negativem Preis sollte auch nicht möglich sein:
%% Cell type:code id:0011-14c35c870296b8f11bfa7fa3eb7f6fd383f1826374f1968bbf280446b13 tags:
```
invalid = Buch(-4.99, 5)
```
%% Output
Traceback (most recent call last):
ValueError: Preis kann nicht negativ sein.
%% Cell type:markdown id:0012-4c8070c18d0173446a7a8b23a7763647207765dbac38ba7bc781dafa47e tags:
Nun lesen und schreiben wir das Attribut `anzahl`:
%% Cell type:code id:0013-e6aa2399c19cceaf94b0dad6a253baac0dab87971c8346eb0cafc2979a4 tags:
```
b.anzahl
```
%% Output
15
%% Cell type:code id:0014-4edd5ed00d01567f46b86066547318c90fc2fb0471534353433aebb46e9 tags:
```
b.anzahl = 0
b.anzahl
```
%% Output
0
%% Cell type:markdown id:0015-e85f9b4c339e1171c457375fd5a3477ab889d320b7c2cf064a85703f6c0 tags:
Schließlich überprüfen wir, ob die Exception geworfen wird, wenn
versucht wird die Anzahl auf einen negativen Wert zu setzen:
%% Cell type:code id:0016-bbbf42dc5710c73d14f07241e374f0f21c1ddb422c2a2b80eb0713f12a1 tags:
```
b.anzahl = -1
```
%% Output
Traceback (most recent call last):
ValueError: Anzahl kann nicht negativ sein.
%% Cell type:markdown id:0017-8f56ac9ab4580c98cb4f698ab32f496b77fc09738a66ba60cd4369e3261 tags:
Auch mit dem Konstruktor sollte eine negative Anzahl nicht möglich sein:
%% Cell type:code id:0018-3a51da14ca09f87b80217ebab93eae1eb269866915ca45b683eb21e5e1a tags:
```
invalid = Buch(4.99, -5)
```
%% Output
Traceback (most recent call last):
ValueError: Anzahl kann nicht negativ sein.
%% Cell type:markdown id:0001-901b4e48ffa59a4623b96e8aefbe202e4f3502a4a9aaf7a601a5c9eaf25 tags:
# Kontrolle über den Datenzugriff
Als Start-Code ist eine Klasse `Buch` gegeben, die Sie fertig stellen
sollen. Das Buch soll einen `preis` und eine `anzahl` als Attribute
haben. Implementieren Sie die Klasse unter Verwendung des Decorators
`property`, um Getter und Setter für die Attribute bereitzustellen.
Dabei ist das Attribut `preis` nach der Erzeugung nur lesbar. Es muss
über den Konstruktor allerdings positiv gesetzt werden, andernfalls soll
ein `ValueError` mit der Nachricht `'Preis kann nicht negativ sein.'`
geworfen werden. Das Attribut `anzahl` darf zwar verändert werden, aber
nicht kleiner als Null, sonst soll analog ein `ValueError` mit der
Nachricht `'Anzahl kann nicht negativ sein.'` geworfen werden.
%% Cell type:code id:0002-931c54f0087ee32ceebf1640e7bf517d2d592021617f06ea16100975ee9 tags:
```
class Buch:
def __init__(self, preis, anzahl):
# TODO: Implementiere die __init__ Methode hier
pass
@property
def preis(self):
# TODO: Implementiere den Getter für den Preis
pass
@property
def anzahl(self):
# TODO: Implementiere den Getter für die Anzahl
pass
@anzahl.setter
def anzahl(self, anzahl):
# TODO: Implementiere den Setter für die Anzahl
pass
```
%% Cell type:markdown id:0003-cf00cd80436b27340dba473e7ae66d421eef75dc49d769ae0f3ac96193f tags:
Wir erstellen zunächst ein gültiges `Buch`:
%% Cell type:code id:0004-41e78a81f1424e9bb6cf719a54a6363701b394864d7f065388b86fe3212 tags:
```
b = Buch(9.99, 15)
```
%% Cell type:markdown id:0005-af5102a1f8f873fb9009623cd5688108809b7244d3d6e2a25a0fffdfbde tags:
Und testen das Attribut `preis`, das man zwar lesen, aber nicht
schreiben können soll:
%% Cell type:code id:0006-ba71ff1a670e3e872245ea74948ccc3e6962a563c42264cca3367e20ced tags:
```
b.preis
```
%% Output
9.99
%% Cell type:code id:0007-7d33c4c17ffca48b4651a94d434eaddbb627d32bdb2191d2e8b77fdede2 tags:
```
b.preis = 10
```
%% Output
Traceback (most recent call last):
AttributeError: property 'preis' of 'Buch' object has no setter
%% Cell type:markdown id:0008-5ff74a728df6d5369f95c02f2d9a626d018c8b488d483209c12059b37dd tags:
Ein Buch mit negativem Preis sollte auch nicht möglich sein:
%% Cell type:code id:0009-14c35c870296b8f11bfa7fa3eb7f6fd383f1826374f1968bbf280446b13 tags:
```
invalid = Buch(-4.99, 5)
```
%% Output
Traceback (most recent call last):
ValueError: Preis kann nicht negativ sein.
%% Cell type:markdown id:0010-4c8070c18d0173446a7a8b23a7763647207765dbac38ba7bc781dafa47e tags:
Nun lesen und schreiben wir das Attribut `anzahl`:
%% Cell type:code id:0011-e6aa2399c19cceaf94b0dad6a253baac0dab87971c8346eb0cafc2979a4 tags:
```
b.anzahl
```
%% Output
15
%% Cell type:code id:0012-4edd5ed00d01567f46b86066547318c90fc2fb0471534353433aebb46e9 tags:
```
b.anzahl = 0
b.anzahl
```
%% Output
0
%% Cell type:markdown id:0013-e85f9b4c339e1171c457375fd5a3477ab889d320b7c2cf064a85703f6c0 tags:
Schließlich überprüfen wir, ob die Exception geworfen wird, wenn
versucht wird die Anzahl auf einen negativen Wert zu setzen:
%% Cell type:code id:0014-bbbf42dc5710c73d14f07241e374f0f21c1ddb422c2a2b80eb0713f12a1 tags:
```
b.anzahl = -1
```
%% Output
Traceback (most recent call last):
ValueError: Anzahl kann nicht negativ sein.
%% Cell type:markdown id:0015-8f56ac9ab4580c98cb4f698ab32f496b77fc09738a66ba60cd4369e3261 tags:
Auch mit dem Konstruktor sollte eine negative Anzahl nicht möglich sein:
%% Cell type:code id:0016-3a51da14ca09f87b80217ebab93eae1eb269866915ca45b683eb21e5e1a tags:
```
invalid = Buch(4.99, -5)
```
%% Output
Traceback (most recent call last):
ValueError: Anzahl kann nicht negativ sein.
%% Cell type:markdown id:0003-463bd56eae3410f384f39f607af2455bdc2ffb2e2d25eddfc8abfde9f65 tags:
# Konventionen für Datenzugriff
Implementieren Sie die Klasse `Person`, die Attribute für den Namen und
das Alter hat. Implementieren Sie die Klasse so, dass auf die Attribute
nicht direkt zugegriffen werden soll. Dabei ist das Attribut `name` ein
nur lesbares Attribut. Verwenden Sie dafür den Decorator `property`. Das
`alter` darf nicht kleiner als Null gesetzt werden, andernfalls soll ein
`ValueError` mit der Nachricht `'Alter kann nicht negativ sein.'`
geworfen werden. Achten Sie auch auf die gängigen Python Konventionen.
## Lösung
Hier ist die Klasse `Person` zu sehen. Dabei ist der Konstruktor
`__init__` definiert, der die Attribute `_name` und `_alter`
initialisiert. Die Attribute haben ein führenden Unterstrich und sind
somit intern. Für das Attribut `_alter` gibt je es eine Set- und
Get-Methode und der Konstruktor nutzt die Set-Methode zum Setzen des
Attributs. Das Attribut `_name` bestitzt allerdings nur die Get-Methode,
daher muss der Konstruktor `_name` direkt setzen.
%% Cell type:code id:0004-c90001402baf5e8f8f9ec01011205818e75d88ba9c310df3e74b42ac17f tags:
```
class Person:
def __init__(self, name, alter):
self._name = name
self.alter = alter
@property
def name(self):
return self._name
@property
def alter(self):
return self._alter
@alter.setter
def alter(self, alter):
if alter < 0:
raise ValueError('Alter kann nicht negativ sein.')
else:
self._alter = alter
```
%% Cell type:markdown id:0005-5502cfc856014e9f1df29edd5b9532980692030611f997a9bdc096b59c1 tags:
Wir erstellen zunächst eine `Person`:
%% Cell type:code id:0006-39a4533d504fa9f5adc5834b16b22057fa1bf8893efacdab76a9b456ed2 tags:
```
p = Person('Max Mustermann', 60)
```
%% Cell type:markdown id:0007-54cab9551d04051e756b10e6eaf4d6e1ac235b50d05020b1e74199f97f9 tags:
Und testen das Attribut `name`, das man zwar lesen, aber nicht schreiben
können soll:
%% Cell type:code id:0008-2c1a90f38430af7a4630380e2c307ed56e870882ca0bf5f0b2d87ad36f6 tags:
```
p.name
```
%% Output
'Max Mustermann'
%% Cell type:code id:0009-4456a98337ac18ace28bc2caf7fc4e347ca4bdaf7dc3610cd923750dfb7 tags:
```
p.name = 'Erika Mustermann'
```
%% Output
Traceback (most recent call last):
AttributeError: property 'name' of 'Person' object has no setter
%% Cell type:markdown id:0010-d5fc1487d666196c5c2b35f017d7f0c49246d027a2a048b6d066a3b2ee4 tags:
Nun lesen und schreiben wir das Attribut `alter`:
%% Cell type:code id:0011-76fb5245e1642aa7dbd52e3502282235ed1584c103f76c8efe609c59e51 tags:
```
p.alter
```
%% Output
60
%% Cell type:code id:0012-22262123cd9318edb6d8ba145a5d0999264af8645d372c01b38ae91a250 tags:
```
p.alter = 0
p.alter
```
%% Output
0
%% Cell type:markdown id:0013-fcf7a9c31084ffb0a35ff8e6bdf7c38e513e47e1453eac4841d5f95629f tags:
Schließlich überprüfen wir, ob die Exception geworfen wird, wenn
versucht wird das Alter auf einen negativen Wert zu setzen:
%% Cell type:code id:0014-145aa52d8007964127d8a3334ea4e4e697b660205b5768e1f3ef8fb327e tags:
```
p.alter = -1
```
%% Output
Traceback (most recent call last):
ValueError: Alter kann nicht negativ sein.
%% Cell type:markdown id:0015-cd9e01a5fbcbccdda1e67f6f9fa85a54e14c32d56b2932d84069a26df76 tags:
Auch mit dem Konstruktor sollte ein negatives Alter nicht möglich sein:
%% Cell type:code id:0016-c87fa0a2830d2395ca4e58f275f17c0011d70c9407f0fe9692027a46c52 tags:
```
invalid = Person('Moritz Mustermann', -5)
```
%% Output
Traceback (most recent call last):
ValueError: Alter kann nicht negativ sein.
%% Cell type:markdown id:0001-333036aeccb2a1e28c64e66df5ea38cef58a6cfafae3c0bb72b77da8092 tags:
# Konventionen für Datenzugriff
Implementieren Sie die Klasse `Person`, die Attribute für den Namen und
das Alter hat. Implementieren Sie die Klasse so, dass auf die Attribute
nicht direkt zugegriffen werden soll. Dabei ist das Attribut `name` ein
nur lesbares Attribut. Verwenden Sie dafür den Decorator `property`. Das
`alter` darf nicht kleiner als Null gesetzt werden, andernfalls soll ein
`ValueError` mit der Nachricht `'Alter kann nicht negativ sein.'`
geworfen werden. Achten Sie auch auf die gängigen Python Konventionen.
%% Cell type:code id:0002-f68c1c3c0b8800aab5705bc86ad42fe6f0d72b05ddec7756657ae6bbef0 tags:
```
class Person:
def __init__(self, name, alter):
# TODO: Implementieren Sie den Konstruktor
pass
```
%% Cell type:markdown id:0003-5502cfc856014e9f1df29edd5b9532980692030611f997a9bdc096b59c1 tags:
Wir erstellen zunächst eine `Person`:
%% Cell type:code id:0004-39a4533d504fa9f5adc5834b16b22057fa1bf8893efacdab76a9b456ed2 tags:
```
p = Person('Max Mustermann', 60)
```
%% Cell type:markdown id:0005-54cab9551d04051e756b10e6eaf4d6e1ac235b50d05020b1e74199f97f9 tags:
Und testen das Attribut `name`, das man zwar lesen, aber nicht schreiben
können soll:
%% Cell type:code id:0006-2c1a90f38430af7a4630380e2c307ed56e870882ca0bf5f0b2d87ad36f6 tags:
```
p.name
```
%% Output
'Max Mustermann'
%% Cell type:code id:0007-4456a98337ac18ace28bc2caf7fc4e347ca4bdaf7dc3610cd923750dfb7 tags:
```
p.name = 'Erika Mustermann'
```
%% Output
Traceback (most recent call last):
AttributeError: property 'name' of 'Person' object has no setter
%% Cell type:markdown id:0008-d5fc1487d666196c5c2b35f017d7f0c49246d027a2a048b6d066a3b2ee4 tags:
Nun lesen und schreiben wir das Attribut `alter`:
%% Cell type:code id:0009-76fb5245e1642aa7dbd52e3502282235ed1584c103f76c8efe609c59e51 tags:
```
p.alter
```
%% Output
60
%% Cell type:code id:0010-22262123cd9318edb6d8ba145a5d0999264af8645d372c01b38ae91a250 tags:
```
p.alter = 0
p.alter
```
%% Output
0
%% Cell type:markdown id:0011-fcf7a9c31084ffb0a35ff8e6bdf7c38e513e47e1453eac4841d5f95629f tags:
Schließlich überprüfen wir, ob die Exception geworfen wird, wenn
versucht wird das Alter auf einen negativen Wert zu setzen:
%% Cell type:code id:0012-145aa52d8007964127d8a3334ea4e4e697b660205b5768e1f3ef8fb327e tags:
```
p.alter = -1
```
%% Output
Traceback (most recent call last):
ValueError: Alter kann nicht negativ sein.
%% Cell type:markdown id:0013-cd9e01a5fbcbccdda1e67f6f9fa85a54e14c32d56b2932d84069a26df76 tags:
Auch mit dem Konstruktor sollte ein negatives Alter nicht möglich sein:
%% Cell type:code id:0014-c87fa0a2830d2395ca4e58f275f17c0011d70c9407f0fe9692027a46c52 tags:
```
invalid = Person('Moritz Mustermann', -5)
```
%% Output
Traceback (most recent call last):
ValueError: Alter kann nicht negativ sein.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment