Python - 从另一个文件访问主脚本中的var的类的实例

时间:2017-11-10 18:07:12

标签: python python-3.x oop

我正在制作一个基于文本的RPG游戏,我把游戏分成很多包含生物类和武器脚本的文件,例如:classes/mobs/goblin.py,我有一个实体的全局列表,所以当暴徒攻击时它从该全局列表中找到该东西的位置,但classes/mobs/default.py中的实例类无法访问main.py文件中的列表。

示例代码:

main.py:

entity_list = ['test']
x = classes.mobs.default.goblin()
x.attack()

goblin.py:

class goblin():
    def __init__(self):
        pass

    def attack(self):
        print(entity_list)

有解决方法吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

def attack(self):
    from .main import entity_list
    print(entity_list)

导入内部方法或函数可用于导致延迟导入。

这样,main.py可能必须导入goblin.py这一事实不会让你处于循环导入状态,因为goblin文件中的main.py导入会延迟到需要时为止。

它也不会对性能造成影响:main和goblin模块已经在内存中并加载,import语句只是对已经存在的对象进行赋值。

答案 1 :(得分:0)

这是一个设计缺陷,虽然您可以将导入功能推向功能,但最好还是解决潜在的问题。

我认为这里最好的选择是创建一个Context类来保存全局状态context.py

_CONTEXT = None
def context():
    global _CONTEXT
    if _CONTEXT is None:
        _CONTEXT = Context()
    return _CONTEXT

class Context(object):
    def __init__(self):
          self.entity_list = ['test']

然后您可以在goblin.py

中自由使用它
from path.to.context import context

class Goblin(object):
    def attack(self):
        print(context().entity_list)

main.py

x = classes.mobs.default.Goblin()
x.attack()

如果您在某个时候想要实施保存/重播/网络播放,您可以扩展context

class Context(object):
    def __init__(self):
          self.__events = []
          self.entity_list = ['test']

    def _addevent(self, name, *options):
        self.__events.append(name, options)
        # and/or send the event to other processes/users/etc.

    def create(self, cls, *args, **kwargs):
        self._addevent('create', cls, args, kwargs)
        return cls(*args, **kwargs)

    def call(self, obj, method, *args, **kwargs):
        self._addevent('call', obj, method, args, kwargs)
        return getattr(obj, method)(*args, **kwargs)

您的main.py将会是这样的:

from path.to.context import context
x = context().create(classes.mobs.default.goblin)
context().call(x, 'attack')

如果需要,可以使用元类和装饰器隐藏语法中的尴尬。