Frage zu Klassen
Verfasst: Dienstag 28. April 2015, 19:59
Hi Leute,
ich habe ein paar Verständnisfragen zu objektorientierter Programmierung. Folgendes Beispiel zeigt den grundlegenden Aufbau des Objektes Reader, das ich bauen möchte.
So weit so gut, alles funktioniert wie es soll. Jetzt möchte ich aber im Init-Bereich des Objektes Reader die unten aufgeführten Funktionen ansiedeln, um sie direkt im Init-Bereich abzurufen. Wie gehe ich dabei am besten vor? Einfaches Einfügen und Aufrufen gibt mir Fehlermeldungen aus.
Im grunde möchte ich realisieren, dass ich das Objekt Reader erstellen kann und dadurch automatisch der Thread mit den unten aufgeführten Funktionen startet. Anschließend sollen über objektinterne Funktionen die Counter-Werte verarbeitet werden und verschiedene Ausgaben ermöglicht werden (z.B. wie oben die Funktion show_values).
Hier ist mein Versuch ... funktioniert aber irgendwie nicht
. Ich glaube so darf ich den Counter nicht übergeben oder?
Ich würde mich sehr über ein paar Anregungen freuen!
Gruß
mobby
ich habe ein paar Verständnisfragen zu objektorientierter Programmierung. Folgendes Beispiel zeigt den grundlegenden Aufbau des Objektes Reader, das ich bauen möchte.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from threading import Lock
class Counter(object):
def __init__(self, value=0):
self.value = value
self.lock = Lock()
def increase(self, value):
with self.lock:
self.value += value
def get_and_reset(self):
with self.lock:
result = self.value
self.value = 0
return result
class Reader(object):
def __init__(self, digital_input, frequency, interval):
self.digital_input = digital_input
self.frequency = frequency
self.interval = interval
self.count = Counter()
# Example for some work to calculate
self.count.increase(self.frequency)
self.count.increase(self.digital_input)
self.count.increase(self.interval)
def show_values(self):
return self.count.get_and_reset() / 20
def main():
digital_input = 2
frequency = 100
interval = 2
test = Reader(digital_input, frequency, interval)
print test.show_values()
if __name__ == '__main__':
main()
Im grunde möchte ich realisieren, dass ich das Objekt Reader erstellen kann und dadurch automatisch der Thread mit den unten aufgeführten Funktionen startet. Anschließend sollen über objektinterne Funktionen die Counter-Werte verarbeitet werden und verschiedene Ausgaben ermöglicht werden (z.B. wie oben die Funktion show_values).
Code: Alles auswählen
def blink_led(digital_output):
piface.digital_write(digital_output, 0)
time.sleep(0.05)
piface.digital_write(digital_output, 1)
def iter_changes(event, frequency, digital_input):
for value, _ in groupby(iter_values(event, frequency, digital_input)):
yield value
def iter_values(event, frequency, digital_input):
while not event.wait(1.0/frequency):
yield piface.digital_read(digital_input)
def read_input(count, event, frequency, digital_input):
for value in iter_changes(event, frequency, digital_input):
if value == 1:
count.increase()
blink_led(digital_input)
def start_thread_read_input(count, event, frequency, digital_input):
thread = Thread(target=read_input, args=(count, event, frequency, digital_input))
thread.setDaemon(True)
thread.start()

Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
from itertools import groupby
from threading import Lock
from threading import Thread
from threading import Event
import pifacedigitalio as piface
class Counter(object):
def __init__(self, value=0):
self.value = value
self.lock = Lock()
def increase(self):
with self.lock:
self.value += 1
def get_and_reset(self):
with self.lock:
result = self.value
self.value = 0
return result
class Reader(object):
def __init__(self, digital_input, frequency, interval):
self.digital_input = digital_input
self.frequency = frequency
self.interval = interval
self.count = Counter()
self.event = Event()
piface.digital_write(digital_input, 1)
# user defined functions
def blink_led(par_digital_input):
piface.digital_write(par_digital_input, 0)
time.sleep(0.05)
piface.digital_write(par_digital_input, 1)
def iter_values(par_event, par_frequency, par_digital_input):
while not par_event.wait(1.0/par_frequency):
yield piface.digital_read(par_digital_input)
def iter_changes(par_event, par_frequency, par_digital_input):
for value, _ in groupby(iter_values(par_event, par_frequency,
par_digital_input)):
yield value
def read_input(par_count, par_event, par_frequency, par_digital_input):
for value in iter_changes(par_event, par_frequency,
par_digital_input):
if value == 1:
par_count.increase()
blink_led(par_digital_input)
# start of thread
self.thread = Thread(target=read_input,
args=(self.count, self.event,self.frequency,
self.interval))
self.thread.setDaemon(True)
self.thread.start()
def show_values(self):
return self.count.get_and_reset()
def main():
piface.init()
digital_input = 1
frequency = 100
interval = 5
event_a = Event()
test = Reader(digital_input, frequency, interval)
timestamp = int(time.time() / interval) * interval
timestamp += interval
while not event_a.wait(max(0, timestamp-time.time())):
timestamp += interval
print test.show_values()
if __name__ == '__main__':
main()
Gruß
mobby