跳转到主要内容

函数和绑定方法观察者模式

项目描述

observed 允许您将函数或方法注册为“观察”其他函数或方法

from observed import observable_function

@observable_function
def observed_func(arg):
    print("observed_func: %s"%(arg,))

def observer_func(arg):
    print("observer_func: %s"%(arg,))

observed_func.add_observer(observer_func)
observed_func('banana')

>>> observed_func: banana
>>> observer_func: banana

您还可以注册绑定方法的观察者

from observed import observable_method

class Foo:
    def __init__(self, name):
        self.name = name

    @observable_method()
    def bar(self, arg):
        print("Object %s invoked bar with arg='%s'"%(self.name, arg))

    def baz(self, arg):
        print("Object %s invoked baz with arg='%s'"%(self.name, arg))

def callback(arg):
    print("callback was invoked with arg='%s'"%(arg,))

a = Foo('a')
b = Foo('b')
a.bar.add_observer(b.bar)
a.bar.add_observer(b.baz)
a.bar.add_observer(callback)
a.bar('banana')

>>> Object a invoked bar with arg='banana'
>>> Object b invoked bar with arg='banana'
>>> Object b invoked baz with arg='banana'
>>> callback was invoked with arg='banana'

您可以要求被观察对象在调用观察者时传递自身作为第一个参数

from observed import observable_function

@observable_function
def observed_func():
    print("observed_func: I was called")

def observer_func(observed):
    print("observer_func: %s called me"%(observed.__name__,))

observed_func.add_observer(observer_func, identify_observed=True)
observed_func()

>>> observed_func: I was called
>>> observer_func: observed_func called me

当被观察的绑定方法将自身作为观察对象传递时,请注意您始终可以通过 __self__ 访问关联的实例

from observed import observable_method

class Foo:
    def __init__(self, name):
        self.name = name

    @observable_method()
    def bar(self):
        print("Object %s invoked bar"%(self.name,))

def callback(observed):
    print("callback was invoked by='%s'"%(observed.__self__.name,))

a = Foo('a')
a.bar.add_observer(callback, identify_observed=True)
a.bar()

>>> Object a invoked bar
>>> callback was invoked by a

显著功能包括

  • 函数或绑定方法不会仅仅因为正在观察其他对象而被保留。这是因为被观察的对象不会保留任何对观察对象的强引用。在CPython中,这意味着您的观察者在引用计数达到零时将自动断开连接。

  • 可以在不可哈希类型的类中的方法上使用 observable_method 装饰器,并且可以在每个类中用于任意数量的方法...

  • ...但处理 observable_method 的描述符不会将其管理的实例粘贴任何数据。观察实例上不会有名称冲突的可能性。

安装

observed 存在于python包索引中,因此您可以通过 pip install observed 安装它。或者,您可以下载源代码包,在分发的根目录中执行

$ python setup.py install

新闻

请参阅 NEWS 文件以查看上一版本的用户可见更改。

许可证

请参阅 LICENSE.txt

下载

可以从python包索引或通过GitHub获取 observed。

文档

基本用法在本文件的顶部展示。更多示例在 example.py 中给出。

开发

observed 的开发托管在 github 上。当前工作存储库在上面的下载部分给出。

错误报告

请将错误报告提交到GitHub跟踪系统

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

observed-0.5.3.tar.gz (8.8 kB 查看哈希值)

上传时间

构建分布

observed-0.5.3-py3-none-any.whl (9.5 kB 查看哈希值)

上传时间 Python 3

支持