在Python中监视变量访问和对象创建

时间:2013-12-05 21:04:57

标签: python

我很想从理论上讲,在游戏中实现时间旅行。我提出的实现非常简单:

在Python程序模拟的游戏世界中发生的一切最终都归结为一个操作:一个变量被改变。

因此,可以通过记录每个变量变化来实现时间旅行;具体而言,存储改变前的价值和改变发生的时间。当时间应该反转时,程序将迭代事件列表,直到它到达时间戳在目标时间之前的那个事件。它也可以及时前进,假设它已经回过头来,通过在最初发生的时间内执行动作列表中的动作。

当然,关键部分是变量变化时的反应方式。如果我理解正确的话,我想用描述符来做这个是可能的,但那会很烦人。我宁愿有办法让时间旅行'选择退出';也就是说,程序会记录任何未明确告知的变量。有没有办法在Python中做到这一点(无论如何不用自己定制解释器)?

1 个答案:

答案 0 :(得分:0)

当然,Python有一些神奇的方法:http://www.rafekettler.com/magicmethods.html ......其中一个是__setattr__(self, name, value)

  

它允许您定义分配给属性的行为   无论该属性是否存在,都意味着你可以   为属性值的任何更改定义自定义规则。

您可以创建一个“时间旅行”基类,它覆盖__setattr__,您可以在其中记录分配给其中一个时间旅行子类中任何属性的时间和值。

更新 - 这是一个具体的例子,其中GunTimeTravelBase类的子类。 Gun color属性已从其历史记录中选择,而分配给shots_fired的新值以及分配时间将附加到Gun的历史记录中:< / p>

import time

class TimeTravelBase(object):
    def __init__(self):
        self.history = []
        self.blacklist = ['blacklist']

    def __setattr__(self, name, value):
        super(TimeTravelBase, self).__setattr__(name, value)
        if hasattr(self, 'blacklist') and name not in self.blacklist:
            self.history.append({'time': time.time(), 'name': name, 'value': value})

class Gun(TimeTravelBase):
    def __init__(self):
        super(Gun, self).__init__()
        self.blacklist.append('color')
        self.shots_fired = 0
        self.color = "black"

    def fire(self):
        self.shots_fired += 1

if __name__=='__main__':
    gun = Gun()
    gun.color = "red"
    gun.fire()
    from pprint import pprint
    pprint(gun.history)

输出:

[{'name': 'shots_fired', 'time': 1386281320.322638, 'value': 0},
 {'name': 'shots_fired', 'time': 1386281320.322645, 'value': 1}]