property auf listen
Verfasst: Samstag 5. Dezember 2009, 15:54
Hallo,
ich hab folgendes Schnipsel:
Der Code basiert auf dem Artikel (http://openbook.galileocomputing.de/pyt ... 12_001.htm).
_Hintergrund_
Ich baue an einer Klasse auf die mehrere Threads zugreifen und möchte die queue schützen. Ich weiß das ich dafür auch ein Queue- Objekt nutzen kann, wollte ich hier aber nicht.
_Problem_
Es funktioniert nicht wie erwartet.
Wenn ich lesend auf die queue zugreife sieht man, dass es geht.
Doch der Zugriff über append() geht nicht durch das property().
Wie man sieht geht das direkte zuweisen wie erwartet, jedoch nicht andere Methoden die auf eine Liste angewendet werden könne.
Wenn jetzt jemand anderes mit der Klasse arbeitet, nehme ich an, das er sich nur anschaut von welchem type event_queue ist und unteranderem über append() zugreifen will.
_Frage_
Muss ich jetzt eine neue Klasse erzeugen die von list erbt um das abzufangen, oder kann man das property() entsprechend anpassen.
Danke
Con
ich hab folgendes Schnipsel:
Code: Alles auswählen
def set_to_event_queue(self, event):
u"""Fügt das Event in die queue *event_queue* ein.
Organisation: fifo"""
print 'set'
try:
self.__event_queue_lock.acquire()
self.__event_queue.append(event)
self.__event_queue_lock.release()
except Exception, e:
print (_(u'Der Zugriff auf die Queue ist fehlgeschlagen: %s' % e))
raise InitializationException
def del_from_event_queue(self):
u"""
Organisation: fifo
@return: event""" # @fixme: header
print 'del'
try:
self.__event_queue_lock.acquire()
event_queue = self.__event_queue.pop()
self.__event_queue_lock.release()
return event_queue
except IndexError:
return None
except Exception, e:
print (_(u'Der Zugriff auf die Queue ist fehlgeschlagen: %s' % e))
raise InitializationException
def get_event_queue(self):
u"""Gibt die Eventqueue als Liste aus.
@return: event_queue"""
print 'get'
try:
self.__event_queue_lock.acquire()
event_queue = self.__event_queue
self.__event_queue_lock.release()
return event_queue
except Exception, e:
print (_(u'Der Zugriff auf die Queue ist fehlgeschlagen: %s' % e))
raise InitializationException
event_queue = property(get_event_queue,set_to_event_queue,del_from_event_queue,'event_queue property')
_Hintergrund_
Ich baue an einer Klasse auf die mehrere Threads zugreifen und möchte die queue schützen. Ich weiß das ich dafür auch ein Queue- Objekt nutzen kann, wollte ich hier aber nicht.
_Problem_
Es funktioniert nicht wie erwartet.
Code: Alles auswählen
$ python
Python 2.6.4 (r264:75706, Nov 2 2009, 14:38:03)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import plugin
>>> p = plugin.Plugin()
>>> print p
<Plugin(Thread-1, initial)>
>>> p.event_queue
get
[]
>>> p.event_queue.append('lala')
get
>>> p.event_queue
get
['lala']
>>>
Doch der Zugriff über append() geht nicht durch das property().
Code: Alles auswählen
>>> p.event_queue.append('lala')
get
>>> p.event_queue
get
['lala']
>>> p.event_queue = 'lala'
set
>>> p.event_queue
get
['lala', 'lala']
>>> p.event_queue = 'lele'
set
>>> p.event_queue
get
['lala', 'lala', 'lele']
Wenn jetzt jemand anderes mit der Klasse arbeitet, nehme ich an, das er sich nur anschaut von welchem type event_queue ist und unteranderem über append() zugreifen will.
_Frage_
Muss ich jetzt eine neue Klasse erzeugen die von list erbt um das abzufangen, oder kann man das property() entsprechend anpassen.
Danke
Con