【发布时间】:2013-10-07 22:09:42
【问题描述】:
我正在尝试想出一种方法来跟踪 Python 中对象的各种重新化身。例如,我想为一个房间上课。这个房间可以作为一个“厨房”开始存在,然后在任何给定的时间点变成一个“书房”。我希望能够跟踪(或记录)我房间生活中的所有这些不同阶段。所以,我想出了这个,我想知道是否有更好的方法来做到这一点。或者,也许我错过了一些东西。不过,据我所知,它似乎符合我的目的。
class room():
def __init__(self,current="Any", history = []):
self.current = childroom(current)
self.history = history
self.history.append(self.current)
def changeroom(self,current = "New"):
self.current = childroom(current)
self.history.append(self.current)
class childroom(room):
def __init__(self,name="Any"):
self.name = name
当我使用此代码时...
>>> myroom = room("kitchen")
>>> myroom.changeroom("study")
>>> myroom
<__main__.room instance at 0x0000000003139208>
>>> myroom.history
[<__main__.childroom instance at 0x0000000003139288>, <__main__.childroom instance at 0x00000000023F4AC8>]
>>> myroom.history[0].name
'kitchen'
【问题讨论】:
-
欢迎来到 StackOverflow!现在,您的问题似乎是“有更好的方法吗?”当然,什么是做任何事情的“更好”方式是非常主观的(一种方式可能更容易编码,另一种可能运行得更快,另一种占用更少的内存,另一种非常适合持久化到数据库)。因此,这个问题不可能有一个单一的答案,因此 StackOverflow 并不是获得此类反馈的最佳场所。如果您正在代码中寻找通用 cmets,请查看 codereview.stackexchange.com。
-
旁白:
def __init__(self,current="Any", history = []):表示在初始化时没有为history传递值的每个room将共享相同 历史记录。 IOW,在执行def时构造一个history列表,而不是每次创建对象时。阅读this question 了解可变默认参数的详细信息。 -
如果历史保存在一个列表中,你真的需要单独跟踪 self.current 吗?它应该始终是附加的最后一项。
-
感谢您的欢迎,马克。所以最好问:我怎么……? DSM,你是对的,最好说:class room(): def __init__(self,current="Any")。无需传递默认历史记录,也无需将历史记录传递给 __ini__() 。 --- 汤姆,我不确定你在说什么。为了让我将具有名称的对象存储在列表中以供将来参考,我需要为其分配一个名称,这是传递给 changeroom() 方法的参数。除非你说我不应该在儿童房中使用“名字”,而应该使用“当前”。