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)
有解决方法吗?提前谢谢。
答案 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')
如果需要,可以使用元类和装饰器隐藏语法中的尴尬。