Sehr abstract erklärt geht es darum, flexibel auf eine Datenquelle zu reagieren, sobald diese sich ändert, ohne dass man überall im Code eingreifen muss (soweit das möglich ist!). Die Datenquelle kann irgendwas sein, Textdatei, json, Datenbank, csv oder sonstwas. Die Daten werden gesammelt und je nach Art der Daten "geschieht" damit was. Sobald sich nun die Datenquelle ändert, soll der Code ohne viel Aufwand daran angepasst werden.
Ich habe dazu mal ein sehr abstraktes Beispiel erstellt. Hier die die Datenquelle der Einfachheit halber ein csv-file. Nach Einlesen werden daraus Objekte gebaut (mit der umstrittenen Methode, um die es eigentlich in diesem thread geht). In
work_with_objects werden die Objekte dann weiter verarbeitet und
Bar Objekte daraus erstellt. In dem Fall hier, werden diese nach einfacher Regel kombiniert, jedoch wird es später viel komplexer, auch mit verschiedenen Objektstrukturen. Wenn sich nun irgendwas an der (in dem Falle csv, Header umbenennen, Spalten anfügen, etc.) ändert, braucht man nur die anfängliche dict anzupassen.
Code: Alles auswählen
Beispiel csv:
description_1;description_2;bar_description_1
desc_1_test1;desc_2_test1;bdesc_1_test1
desc_1_test2;desc_2_test2;bdesc_1_test2
desc_1_test3;desc_2_test3;bdesc_1_test3
desc_1_test4;desc_2_test4;bdesc_1_test4
Code: Alles auswählen
#!/usr/bin/env/python
import csv
d = dict(foo_var_1 = 'description_1', foo_var_2 = 'description_2',
bar_var_1 = 'bar_description_1')
class Foo():
def __init__(self):
pass
def read_csv_file() -> list:
with open('test.csv', newline = '', encoding = 'utf-8') as csvfile:
line = csv.DictReader(csvfile, delimiter=';')
l = []
for row in line:
f = Foo()
for key, value in d.items():
setattr(f, key, row[value])
l.append(f)
return l
class Bar():
def __init__(self):
pass
def work_with_objects(list_of_foo) -> tuple:
a_list = []
b_list = []
for n in list_of_foo:
a = Bar()
b = Bar()
for key, value in d.items():
if 'foo' in key:
setattr(a, key, getattr(n, key))
if 'bar' in key:
setattr(b, key, getattr(n, key))
a_list.append(a)
b_list.append(b)
return (a_list, b_list)
def main():
list_of_foo = read_csv_file()
works = work_with_objects(list_of_foo)
if __name__ == '__main__':
main()