Skip to main content

A simple C#-like implementation of the Observer design pattern.

Project description

nmevent v0.2.1 - C#-like implementation of the Observer pattern

This is a Python module :mod:`nmevent`, simple C#-like implementation of
the Observer pattern (http://en.wikipedia.org/wiki/Observer_pattern).
It's main purpose and goal is to allow developers to use events
with C#-like syntax in their Python classes.

=============
Usage example
=============

The most straightfoward way to use :mod:`nmevent` is this:

>>> import nmevent
>>> class ExampleClass(object):
... def __init__(self):
... self.event = nmevent.Event()
...
... def _do_something(self):
... self.event(self)
...
>>> example = ExampleClass()
>>> example.event += handler

It should be noted, that event doesn't necessarily need to be an object
attribute. :class:`Event` instance is basically just a callable object that
works as a sort of "dispatch demultiplexer".

This usage, however, isn't very C#-like. In C#, events are declared in class
scope and that's why the :class:`Event` class also supports the descriptor
protocol (you can use the same way you use the built-in ``property`` object).

>>> from nmevent import EventSlot
>>> class ExampleClass(object):
... event = Event()
...
... def _do_something(self):
... self.event()
...
>>> def handler(sender, **keywords):
... pass
...
>>> example = ExampleClass()
>>> example.event += handler

Perhaps this looks even more straightfoward than instantiating :class:`Event`
in object's constructor, but there's actually lot more going on under hood this
time.

Finally, there is the :class:`Property` descriptor and the associated
:func:`nmproperty` function decorator, which work very much like the built-in
``property`` object and decorator, except it can optionally call a callback
function if the property's value changes after calling the setter function. It
can work in tandem with the :func:`with_events` class decorator, which
decorates the class with property change events and connects them to the
instances of :class:`Property` class. It also creates events for the built-in
``property`` objects, but you have to raise the events yourself in the setter
function or elsewhere.

>>> import nmevent
>>> @nmevent.with_events
... class ExampleClass(object):
... @nmevent.nmproperty
... def x(self):
... return self._x
...
... @x.setter
... def x(self, value):
... self._x = value
...
... @property
... def y(self):
... return self._y
...
... @y.setter
... def y(self, value):
... old_value, self._y = self._y, value
... self.y_changed(old_value = old_value)
...
>>> example = ExampleClass()
>>> example.x_changed += handler
>>> example.x = 10 # handler gets called

=======
License
=======

Copyright (c) 2010, Jan Milík.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope the it will be useful,
but WITHOUT ANY WARRANTY; without event the implied warranty of
MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

=======
Changes
=======

v0.1
Initial release.

v0.1.1
No changes in source code. Improved documentation and unit tests.

v0.2
Rewritten most of the code. The :class:`Event` class now works as a
descriptor, which eliminated the need for a separate :class:`EventSlot`
class and simplified usage. Added :class:`CallbackStore` to abstract
the callback storage.

v0.2.1
Rewritten some unit tests and added new ones. Improved documentation
a little bit.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nmevent-0.2.1.tar.gz (71.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

nmevent-0.2.1.win32-py2.6.exe (209.3 kB view details)

Uploaded Source

nmevent-0.2.1-py2.6.egg (15.7 kB view details)

Uploaded Egg

File details

Details for the file nmevent-0.2.1.tar.gz.

File metadata

  • Download URL: nmevent-0.2.1.tar.gz
  • Upload date:
  • Size: 71.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for nmevent-0.2.1.tar.gz
Algorithm Hash digest
SHA256 abf63c4b4f3cc100ad7faa2c23ff9ba9272ffdd45866f3fcfab69af0c2e59ee4
MD5 43c891faee4593dd6dbffd022798b434
BLAKE2b-256 ede88e3416c49d7ab5019d1221d6ed0eec586256f2ab8c1a1c0003a21cc98d10

See more details on using hashes here.

File details

Details for the file nmevent-0.2.1.win32-py2.6.exe.

File metadata

File hashes

Hashes for nmevent-0.2.1.win32-py2.6.exe
Algorithm Hash digest
SHA256 3b0d8e82cdc3625969fd2e34ffc725907b60716bb0d5d60464ca1951fd018a14
MD5 c770c410894de144e7a392f7a464e14a
BLAKE2b-256 187803a7578fe0bc741d4f18499c85d1b936491c928913294cee4ed15976beee

See more details on using hashes here.

File details

Details for the file nmevent-0.2.1-py2.6.egg.

File metadata

  • Download URL: nmevent-0.2.1-py2.6.egg
  • Upload date:
  • Size: 15.7 kB
  • Tags: Egg
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for nmevent-0.2.1-py2.6.egg
Algorithm Hash digest
SHA256 62b1c5261306ceb4ba55f6ede943766ce1432d490a23a489349c6dcb421a04a5
MD5 8061c0ce7268dce0d6407821480c1131
BLAKE2b-256 3d74f793c97958acbc6c706cd678b80ec05988077810c483af76c1870ba1cc4e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page