关于 python 个对象及其方法
regarding python objects and their methods
我目前正在尝试用纯 python 编写基于文本的冒险。因此我有一个房间 class 看起来有点像这样(缩写):
class Room1(Room):
def __init__(self):
Room.__init__(self)
self.init_objects()
self.description = """Looks like a living room. There's a lamp, a
cupboard, and
a door to your right. On the floor, there's a carpet."""
self.door_state = 1
self.carpet_state = 0
self.images = [(text-based images)]
def init_objects(self):
self.objects = {"door" : Door1(),
"frontdoor" : FrontDoor(),
"carpet" : Carpet(),
"lamp" : Lamp1(),
"clock" : Clock(),
"escritoire" : Escritoire(),
"booklet" : Booklet(),
"screws" : Screws(),
"trapdoor" : TrapDoor()}
def update_image(self):
IMG_MAPPER = {(0, 0, 0) : 0,
(0, 0, 1) : 1,
(1, 0, 0) : 2,
(1, 0, 1) : 3,
(1, 1, 1) : 4,
(1, 1, 0) : 5,
(0, 1, 1) : 6,
(0, 1, 0) : 7}
key = (self.objects["door"].state, self.objects["carpet"].state)
self.img = img_mapper[key]
我的问题出在 Room 的 update_image() 方法上。我需要一个映射器存储在那里以根据对象的状态(打开/关闭)找出正确的图像,如果我把这个映射器放在方法的开头,这个字典由 python 读取和构造每次调用该方法时,对吗?那么我应该将这个映射器字典存储为实例变量,例如 self.img_mapper_dict = {(0, 0, 0) : 0, ...}?
有人对此有什么想法吗?
我认为您遇到的问题是 img_mapper
每次调用 update_image()
时都会重置为指定状态 。这是因为成员函数有自己的作用域,所以当它完成时它会删除 img_mapper
并且必须在下次调用更新函数时重新创建它。存储为成员变量将摆脱这个问题。
您假设当前代码的结构方式是正确的,每次调用 update_image()
方法时都会分配给 IMAGE_MAPPER
。
现在,由于这是一个不随时间变化的静态映射,从功能的角度来看这不是问题 - 它不像您要重置一个应该在两次调用之间跟踪的值 update_image()
.
在性能方面,在这种特殊情况下,缺点也完全可以忽略不计。
但是从纯逻辑的角度来看,将此映射设为 class attribute:
可能是有意义的
class Room1(Room):
IMG_MAPPING = {(0, 0, 0) : 0,
(0, 0, 1) : 1,
(1, 0, 0) : 2,
(1, 0, 1) : 3,
(1, 1, 1) : 4,
(1, 1, 0) : 5,
(0, 1, 1) : 6,
(0, 1, 0) : 7}
def __init__(self):
# ...
def update_image(self):
# ...
self.img = Room1.IMG_MAPPING[key]
我建议使用 class 属性而不是实例属性(或实例成员),因为该映射对于 Room1
的所有实例都将保持相同(对吗?我假设 Room1
的每个实例都具有完全相同的布局,只是门状态不同等等)。所以它不依赖于实例的任何状态,而是 class 的 属性。
另请注意,class 属性的访问方式不同:Room1.IMG_MAPPING
而不是 self.IMG_MAPPING
。这也反映了它不依赖于实例的事实。
我看到的第一个问题是您的 IMG_MAPPER 字典有三元组键。但是你是通过提供一个二元组来访问它的。
我目前正在尝试用纯 python 编写基于文本的冒险。因此我有一个房间 class 看起来有点像这样(缩写):
class Room1(Room):
def __init__(self):
Room.__init__(self)
self.init_objects()
self.description = """Looks like a living room. There's a lamp, a
cupboard, and
a door to your right. On the floor, there's a carpet."""
self.door_state = 1
self.carpet_state = 0
self.images = [(text-based images)]
def init_objects(self):
self.objects = {"door" : Door1(),
"frontdoor" : FrontDoor(),
"carpet" : Carpet(),
"lamp" : Lamp1(),
"clock" : Clock(),
"escritoire" : Escritoire(),
"booklet" : Booklet(),
"screws" : Screws(),
"trapdoor" : TrapDoor()}
def update_image(self):
IMG_MAPPER = {(0, 0, 0) : 0,
(0, 0, 1) : 1,
(1, 0, 0) : 2,
(1, 0, 1) : 3,
(1, 1, 1) : 4,
(1, 1, 0) : 5,
(0, 1, 1) : 6,
(0, 1, 0) : 7}
key = (self.objects["door"].state, self.objects["carpet"].state)
self.img = img_mapper[key]
我的问题出在 Room 的 update_image() 方法上。我需要一个映射器存储在那里以根据对象的状态(打开/关闭)找出正确的图像,如果我把这个映射器放在方法的开头,这个字典由 python 读取和构造每次调用该方法时,对吗?那么我应该将这个映射器字典存储为实例变量,例如 self.img_mapper_dict = {(0, 0, 0) : 0, ...}?
有人对此有什么想法吗?
我认为您遇到的问题是 img_mapper
每次调用 update_image()
时都会重置为指定状态 。这是因为成员函数有自己的作用域,所以当它完成时它会删除 img_mapper
并且必须在下次调用更新函数时重新创建它。存储为成员变量将摆脱这个问题。
您假设当前代码的结构方式是正确的,每次调用 update_image()
方法时都会分配给 IMAGE_MAPPER
。
现在,由于这是一个不随时间变化的静态映射,从功能的角度来看这不是问题 - 它不像您要重置一个应该在两次调用之间跟踪的值 update_image()
.
在性能方面,在这种特殊情况下,缺点也完全可以忽略不计。
但是从纯逻辑的角度来看,将此映射设为 class attribute:
可能是有意义的class Room1(Room):
IMG_MAPPING = {(0, 0, 0) : 0,
(0, 0, 1) : 1,
(1, 0, 0) : 2,
(1, 0, 1) : 3,
(1, 1, 1) : 4,
(1, 1, 0) : 5,
(0, 1, 1) : 6,
(0, 1, 0) : 7}
def __init__(self):
# ...
def update_image(self):
# ...
self.img = Room1.IMG_MAPPING[key]
我建议使用 class 属性而不是实例属性(或实例成员),因为该映射对于 Room1
的所有实例都将保持相同(对吗?我假设 Room1
的每个实例都具有完全相同的布局,只是门状态不同等等)。所以它不依赖于实例的任何状态,而是 class 的 属性。
另请注意,class 属性的访问方式不同:Room1.IMG_MAPPING
而不是 self.IMG_MAPPING
。这也反映了它不依赖于实例的事实。
我看到的第一个问题是您的 IMG_MAPPER 字典有三元组键。但是你是通过提供一个二元组来访问它的。