-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathOOP1.py
More file actions
executable file
·137 lines (112 loc) · 3.68 KB
/
OOP1.py
File metadata and controls
executable file
·137 lines (112 loc) · 3.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env python3
from getpass import getuser
import webbrowser
class Simple:
"""
Dies ist die einfachst mögliche Klasse.
Sie hat keine Methoden, keine Attribute
und erbt (implizit) von `object`.
Sie ist allerdings relativ langweilig,
weil man recht wenig mit ihr machen kann.
Klassennamen sollten laut PEP8 in CamelCase sein
und mit einem Großbuchstaben beginnen
(https://www.python.org/dev/peps/pep-0008/#class-names).
"""
pass
class HelloWorld:
""" Diese Klasse hat eine (statische) Methode. """
def hello_world():
"""
Diese Methode gibt "Hello World!" auf der Konsole aus.
Funktions- oder Methodennamen sollten laut PEP8 kleingeschrieben
werden und evtl. mit Unterstrichen getrennt sein
(https://www.python.org/dev/peps/pep-0008/#function-names).
"""
print("Hello, World!")
# Die Methode aufrufen:
HelloWorld.hello_world()
class Hello:
def hello(name: str = "World") -> None:
"""
Natürlich können Methoden auch Parameter haben.
Dies funktioniert genau so wie bei Funktionen.
"""
print(f"Hello, {name}!")
# Die Methode aufrufen:
Hello.hello(getuser())
class SpecialNumbers:
"""
Diese Klasse hat nur statische Attribute.
Da dies hier Konstanten sind, sind ihre Namen großschrieben
(https://www.python.org/dev/peps/pep-0008/#constants).
"""
PI = 3.14 # type: float
E = 2.71
# Zugriff
print(SpecialNumbers.PI)
# Problem: Der Zugriff aus statischen Methoden auf statische Attribute ist unschön.
# (`__class__` und so)
class Calculator:
"""
Diese Klasse hat zusätzlich zu den statischen Attributen
auch noch zwei statische Methoden.
"""
PI = 3.14
E = 2.71
@classmethod
def multiply_by_pi(cls, number):
"""
Dies ist eine statische Methode mit Klassenreferenz.
Dies lässt sich daran erkennen, dass der erste Parameter `cls` ist
und an dem Dekorator `@classmethod`.
Dieses `cls` ist eine Referenz auf die Klasse.
Da Variablennamen nur innerhalb von Funktionen und Modulen
aufgelöst werden, ist dies nötig.
"""
return number * cls.PI
@classmethod
def multiply_by_e(cls, number):
return number * cls.E
print(Calculator.multiply_by_pi(5)) # Aufruf der Methode
class Thing:
"""
Auch dies ist wieder eine ziemlich nutzlose Klasse.
Aber sie hat einen Konstruktor!
"""
def __init__(self) -> None:
"""
Dies ist ein Konstruktor.
Bis auf den Namen ähnelt er anderen Instanz-Methoden.
Er wird aufgerufen, wenn die Klasse instanziert wird.
Standardmäßig existiert ein leerer Konstruktor ohne Parameter.
"""
print ("Hallo!")
Thing() # Instanziierung
# Ab Python 3.7 kann man hierfür auch dataclasses benutzen:
# https://docs.python.org/3/library/dataclasses.html
class Contact:
""" Ein Adressbucheintrag. """
def __init__(self, name: str, phone: int, email: str) -> None:
"""
Dies ist ein Konstruktor.
Aber dieser hat Parameter.
Diese Parameter werden Instanzvariablen zugewiesen.
"""
self.name = name
self.phone = phone
self.email = email
def print(self):
"""
Druckt den Kontakt aus.
"""
print(f"Name: {self.name}")
print(f"Telefonnummer: {self.phone}")
print(f"E-Mail: {self.email}")
c = Contact("Ich", "01234-56789", "[email protected]")
c.print()
class HTTPURL:
""" Diese Klasse repräsentiert eine HTTPURL. """
def __init__(self, url: str) -> None:
self.url = url
def open(self) -> None:
webbrowser.open(self.url)