从其他对象实例访问对象实例的模式
Pattern to access to object instance from other object instances
提前致谢。鉴于 类...
的这些示例
# registers all that happens during a combat
class CombatLog:
def __init__(self):
self.actions = []
# it handles a combat
class Combat:
def __init__(self):
self.fighters = [] # list of fighter instances
self.combat_log = CombatLog()
def run_round(self):
# do whatever
self.combat_log.log(...)
# are the fighters in a combat
class Fighter:
def __init__(self):
self.property1 = 1
self.property2 = 2
self.attacks = [] # list of attack instances
def attack(self):
# do whatever
self.combat_log.log(...) # clean way to access the log?
class Attack:
def __init__(self):
self.damage = 10
def cast(self):
# do whatever
self.combat_log.log(...) # clean way to access the log?
# from somewhere else in the code
combat1 = Combat()
combat2 = Combat()
我想知道处理下一个要求的最佳模式是什么:
- 每场战斗都有一个独特的战斗日志实例。因此,如果有 2 个 Combat 实例,则战斗将有 2 个 CombatLog 实例。
- 我想在需要的地方使用战斗日志。例如,如果战斗机、战斗或攻击需要访问日志。 CombatLog 就像一些 "global" 对象,仅在该战斗中以及该战斗中的所有实例中。
- 当 Combat 完成并从内存中删除时,CombatLog 也会被删除。
我正在考虑的方法,但我不是 proud/sure 中的方法:
- 通过所有子实例(战士和攻击)传递日志实例
- 制作某种日志管理器(如 Singleton),然后从我想要的地方请求该战斗的日志。但我有一个类似的问题,那就是我必须将那场战斗的 ID 传递给所有 chindren,以便向日志管理器请求正确的日志......这与以前的问题差不多。
- 我正在考虑制作某种依赖注入器,比如使用装饰器等,但我总是遇到同样的问题(之前的那个)。
也许我需要另一种方法,但我想不出...代码在Python.
非常感谢您的宝贵时间。
还有另一种简单的方法,无论如何我认为最好的选择是在引用对象 Combat 的其他对象中有一个指针,但这似乎不可能:
Pointers in Python?
您可以维护一个 Combats 字典并将它们的密钥传递给它们自己和其他对象:
combats = {uuid0: Combat(), uuid1: Combat()}
并像
一样访问它们
class Attack:
def __init__(self, combatUUID = None):
self.damage = 10
if combatUUID: self.combatUUID = combatUUID
def cast(self):
# do whatever
if self.combatUUID in combats: combats[self.combatUUID].log(...)
如果一个战士只存在于一场战斗中,让它知道它在哪场战斗中:
class Fighter:
def __init__(self, combat, name):
self.name = name
self.combat = combat
def attack(self):
self.combat.log.append('{name} attacking'.format(name=self.name))
如果一个战士可以切换战斗,添加一个战斗setter:
class Figthter:
# init(self, name) ...
def set_combat(combat):
self.combat = combat
提前致谢。鉴于 类...
的这些示例
# registers all that happens during a combat
class CombatLog:
def __init__(self):
self.actions = []
# it handles a combat
class Combat:
def __init__(self):
self.fighters = [] # list of fighter instances
self.combat_log = CombatLog()
def run_round(self):
# do whatever
self.combat_log.log(...)
# are the fighters in a combat
class Fighter:
def __init__(self):
self.property1 = 1
self.property2 = 2
self.attacks = [] # list of attack instances
def attack(self):
# do whatever
self.combat_log.log(...) # clean way to access the log?
class Attack:
def __init__(self):
self.damage = 10
def cast(self):
# do whatever
self.combat_log.log(...) # clean way to access the log?
# from somewhere else in the code
combat1 = Combat()
combat2 = Combat()
我想知道处理下一个要求的最佳模式是什么:
- 每场战斗都有一个独特的战斗日志实例。因此,如果有 2 个 Combat 实例,则战斗将有 2 个 CombatLog 实例。
- 我想在需要的地方使用战斗日志。例如,如果战斗机、战斗或攻击需要访问日志。 CombatLog 就像一些 "global" 对象,仅在该战斗中以及该战斗中的所有实例中。
- 当 Combat 完成并从内存中删除时,CombatLog 也会被删除。
我正在考虑的方法,但我不是 proud/sure 中的方法:
- 通过所有子实例(战士和攻击)传递日志实例
- 制作某种日志管理器(如 Singleton),然后从我想要的地方请求该战斗的日志。但我有一个类似的问题,那就是我必须将那场战斗的 ID 传递给所有 chindren,以便向日志管理器请求正确的日志......这与以前的问题差不多。
- 我正在考虑制作某种依赖注入器,比如使用装饰器等,但我总是遇到同样的问题(之前的那个)。
也许我需要另一种方法,但我想不出...代码在Python.
非常感谢您的宝贵时间。
还有另一种简单的方法,无论如何我认为最好的选择是在引用对象 Combat 的其他对象中有一个指针,但这似乎不可能:
Pointers in Python?
您可以维护一个 Combats 字典并将它们的密钥传递给它们自己和其他对象:
combats = {uuid0: Combat(), uuid1: Combat()}
并像
一样访问它们class Attack:
def __init__(self, combatUUID = None):
self.damage = 10
if combatUUID: self.combatUUID = combatUUID
def cast(self):
# do whatever
if self.combatUUID in combats: combats[self.combatUUID].log(...)
如果一个战士只存在于一场战斗中,让它知道它在哪场战斗中:
class Fighter:
def __init__(self, combat, name):
self.name = name
self.combat = combat
def attack(self):
self.combat.log.append('{name} attacking'.format(name=self.name))
如果一个战士可以切换战斗,添加一个战斗setter:
class Figthter:
# init(self, name) ...
def set_combat(combat):
self.combat = combat