99 lines
2.6 KiB
Python
99 lines
2.6 KiB
Python
|
|
# PascalCase
|
|
class Robot:
|
|
# alle funktionen mit unterstrichen links und rechts müssen exakt so heißen
|
|
def __init__(self, name):
|
|
print(f"Creating a new robot named {name}")
|
|
# __ führt dazu das ein Attribut privat ist
|
|
# bedeutet, es kann nur innerhalb der Klasse genutzt werden
|
|
self.__name = name
|
|
self.set_name(name)
|
|
|
|
def get_name(self):
|
|
return self.__name
|
|
|
|
def set_name(self, name):
|
|
if len(name) < 6:
|
|
raise ValueError("RObot name has to have at least 6 characters")
|
|
self.__name = name
|
|
|
|
def say_hi(self):
|
|
print(f"Hello, I'm a robot called {self.__name}")
|
|
|
|
|
|
r1 = Robot("Bender") # führt die init-funktion aus
|
|
print(r1.__dict__)
|
|
r1.build_year = 2996
|
|
print(r1.__dict__)
|
|
print(r1.__dict__)
|
|
|
|
|
|
|
|
print(r1.get_name())
|
|
r1.say_hi() # r1 -> Robot -> Robot.say_hi(r1)
|
|
Robot.say_hi(r1) # wird so nie geschrieben
|
|
# Attribute können zu jeder Zeit geändert werden (nicht private)
|
|
r1.__name = "Calculon"
|
|
r1.say_hi()
|
|
# 2 eigene Klassen schreiben
|
|
# Circle und Rectangle
|
|
# radius
|
|
# Rectangle hat die Attribute: height, width
|
|
# beide Klassen haben die Funktionen:
|
|
# calc_area() # kreis: pi*radius**2 3.14
|
|
# calc_perimeter() # 2 * pi * radius
|
|
import math
|
|
class Circle:
|
|
def __init__(self, radius):
|
|
self.__radius = radius
|
|
self.set_radius(radius)
|
|
self.__area = 0
|
|
self.__area_computed = False
|
|
|
|
def get_radius(self):
|
|
return self.__radius
|
|
|
|
def set_radius(self, radius):
|
|
assert radius > 0, (f"Radius {radius}, was smaller 0")
|
|
self.__radius = radius
|
|
self.__area_computed = False
|
|
# area berechnen
|
|
|
|
def get_area(self):
|
|
if self.__area_computed:
|
|
return self.__area
|
|
print("Calculting the area")
|
|
self.__area = 3.14 * self.__radius ** 2 # ^,|,& -> binäre operatoren
|
|
self.__area_computed = True
|
|
return self.__area
|
|
|
|
def calc_perimeter(self):
|
|
return 2 * 3.14 * self.__radius
|
|
|
|
class Rectangle:
|
|
def __init__(self, width, height):
|
|
self.width = width
|
|
self.height = height
|
|
|
|
def calc_area(self):
|
|
area = self.width * self.height
|
|
return area
|
|
|
|
def calc_perimeter(self):
|
|
perimeter = 2 * (self.width + self.height)
|
|
return perimeter
|
|
|
|
if __name__ == "__main__":
|
|
print("-"*100)
|
|
c1 = Circle(2)
|
|
area = c1.get_area() # Circle.calc_area(c1)
|
|
print(area)
|
|
print()
|
|
print(c1.get_area())
|
|
c1.set_radius(5)
|
|
print(c1.get_area())
|
|
# schönen weg mit properties
|
|
c1.set_radius(c1.get_radius() + 1)
|
|
c1.radius += 3 # fehleranfällig
|
|
# beides verbinden -> properties
|
|
# als dataclasses! |