演员模型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()
运行
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())
当一个演员的属性或者方法被标记为可遍历的,它就可以正常的执行在上下文中,通过其他演员的代理对象。
备注:
在pykka2.0以下版本,需要手动设置属性pykka_traversable为True来设置遍历属性
class AnActor(pykka.ThreadingActor):
playback = Playback()
class Playback(object):
pykka_traversable = True
def play(self):
return True