python - 为什么类属性只改变一次?
问题描述
class Battlefield:
def __init__(self):
self.field = new_battlefield()
self.amount_ships = 0
self.ships = []
self.fourdeck = []
self.tripledecks = []
self.doubledecks = []
self.singledecks = []
def change_value(self, point, value):
if '\n' in self.field[point]:
self.field[point] = ' {}\n'.format(value)
else:
self.field[point] = ' {}'.format(value)
def make_move(self):
pass
def __str__(self):
return ' a b c d e f g h i j\n\n' + \
''.join(self.field.values())
Battlefield.field 是带有键的字典:
1 1a 1b 1c 1d 1e 1f 1g 1h 1i 1j
2 2a 2b 2c 2d
3 ..
4 ..
5 ..
6 ..
7 ..
8 ..
9 ..
10 10a 10b 10c 10d 10e 10f 10g 10h 10j
我知道这远非最佳解决方案,但为了解决这个问题,我决定编写一个游标类:
class Cursor:
def __init__(self, start_point=None):
self.battlefield = Battlefield()
self.field_keys = list(self.battlefield.field.keys())
if start_point is not None:
self.point = start_point
else:
self.point = '1a'
self.battlefield.change_value(self.point, 'X')
self.point_key_idx = self.field_keys.index(self.point)
def up(self):
if self.point_key_idx not in range(1, 11):
new_point_key = self.point_key_idx - 11
self.point = self.field_keys[new_point_key]
return self.point
def down(self):
pass
def left(self):
pass
def right(self):
pass
def move(self, move):
if move in ('up', 'down', 'left', 'right'):
self.battlefield.change_value(self.point, '~')
new_point = self.__getattribute__(move)()
self.battlefield.change_value(new_point, 'X')
else:
raise ValueError('Move must be in: up, down, left, right.')
return new_point
我的问题: 当我尝试使用“向上”功能和其他功能多次移动光标时,self.point 值仅更改一次。
cur = Cursor('4d')
print(cur.point) # 4d
cur.up()
print(cur.point) # 3d
cur.up()
print(cur.point) # 3d
cur.up()
print(cur.point) # 3d
最后一次使用函数应该返回“1d”。我不知道该怎么办..
解决方案
你只是在更新self.point
,而不是self.point_key_idx
。
def up(self):
if self.point_key_idx not in range(1, 11):
self.point_key_idx -= 11
self.point = self.field_keys[self.point_key_idx]
return self.point
推荐阅读
- java - java 8 中的时区 getDSTSavings/observesDaylightTime 等效项
- java - 如何使用实体管理器创建像 JPA 这样的 MongoDB DAO 层,以便在设计方面促进所有其他 DAO 类?
- javascript - nodejs twitter stream "listener" 参数必须是函数类型
- python - PyTesseract 无法识别小数
- php - laravel中如何选择期权金额记录用户?
- python - 如何使用PYCHARM IDE查看张量流中每一层CNN之后的输出?
- sql - 在雪花中用“LEVEL”重写查询
- amazon-web-services - 通过 Amazon CloudFront 保护 webfonts 不被下载
- spring-boot - 将 Hazelcast 用于 Spring Session 和带有 Hibernate 的 2 级缓存 (LC2)
- unity3d - 无法从 .mtl 文件中统一应用材料