演员模型pykka⑥-可遍历的属性

演员模型pykka⑥-可遍历的属性

使用场景

当一个演员的代理对象想要执行另一个演员的方法或者访问另一个演员的属性时,如果直接访问是无法访问的,需要把被访问的演员属性设置为可遍历才可以访问。

直接访问失败的例子

# encoding=utf-8
from typing import Any

import pykka


class AnActor(pykka.ThreadingActor):
    def __init__(self, *args: Any, **kwargs: Any):
        super().__init__(*args, **kwargs)
        self.name = "小明-AnActor"

    def play(self):
        print("我是AnActor类的play方法")
        return "yes"


class OtherActor(pykka.ThreadingActor):
    def __init__(self, *args: Any, **kwargs: Any):
        super().__init__(*args, **kwargs)
        self.name = "小红"
        self.an_actor = AnActor()


if __name__ == '__main__':
    proxy = OtherActor.start().proxy()
    proxy.an_actor.name
    proxy.an_actor.play()

运行

image-20220208151835985

image-20220208151855436

pykka.traversable 类

标记一个演员的属性是可遍历属性

这个类使演员自己的属性或者方法是可遍历的,能被其他演员的代理对象有效的访问

使用方法,通过pykka.traversable(Playback())语句

class AnActor(pykka.ThreadingActor):
    playback = pykka.traversable(Playback())

class Playback(object):
    def play(self):
        return True

或者使用装饰器

class AnActor(pykka.ThreadingActor):
    playback = Playback()

@pykka.traversable
class Playback(object):
    def play(self):
        return True

例子

# encoding=utf-8
from typing import Any

import pykka


class AnActor(pykka.ThreadingActor):
    def __init__(self, *args: Any, **kwargs: Any):
        super().__init__(*args, **kwargs)
        self.name = "小明-AnActor"

    def play(self):
        print("我是AnActor类的play方法")
        return "yes"


class OtherActor(pykka.ThreadingActor):
    def __init__(self, *args: Any, **kwargs: Any):
        super().__init__(*args, **kwargs)
        self.name = "小红"
        self.an_actor = pykka.traversable(AnActor())


if __name__ == '__main__':
    proxy = OtherActor.start().proxy()
    name = proxy.an_actor.name
    print(f"name:{name.get()}")
    print(proxy.an_actor.play().get())

image-20220208152312213

当一个演员的属性或者方法被标记为可遍历的,它就可以正常的执行在上下文中,通过其他演员的代理对象。

备注:

在pykka2.0以下版本,需要手动设置属性pykka_traversable为True来设置遍历属性

class AnActor(pykka.ThreadingActor):
    playback = Playback()

class Playback(object):
    pykka_traversable = True

    def play(self):
        return True
posted @ 2022-02-14 19:09  南风丶轻语  阅读(50)  评论(0编辑  收藏  举报