在Python中使用dict快速修改对象

时间:2018-10-05 03:51:26

标签: python dictionary switch-statement

我对编程还很陌生,我正在尝试找到最有效的方法来迭代对象,以便每次通过都更新其状态。我以为可以在Python 3.6中使用字典来运行对象中的代码。我希望看到输出如下:

Tank A is clean    
dirty    
Tank B is dirty    
clean

,最后切换到坦克对象模式。为什么这样不起作用,从实例化容器中选择正确的def来运行的最有效方法是什么?

class Tank:
    def __init__(self, mode, name):
        self.mode = mode
        self.name = name
    def dirty(self):
        print("%s is dirty"%(self.name))
        self.mode = 'clean'
        return self
    def clean(self):
        print("%s is clean"%(self.name))
        self.mode = 'dirty'
        return self
i = 0
tankList = []
tankList.append(Tank('clean', "Tank A"))
tankList.append(Tank('dirty', "Tank B"))

while i < 2:
    #create the mode lookup
    dict = {'clean': tankList[i].clean(), 'dirty': tankList[i].dirty()}
    #update the tank mode
    tankList[i] = dict[tankList[i].mode]
    #display the tank mode
    print(tankList[i].mode)
    i += 1

2 个答案:

答案 0 :(得分:0)

您不一定需要上课。您始终可以将所有战车存放在字典中,并通过访问这些属性来更新/显示战车的状态。

tanks = {}

tanks['tankA'] = {'name': 'Tank A', 'mode': 'clean'}
tanks['tankB'] = {'name': 'Tank B', 'mode': 'dirty'}

for t in tanks:
    print('{} is {}'.format(tanks[t]['name'], tanks[t]['mode']))

print('updating Tank A mode...')

tanks['tankA']['mode'] = 'dirty'

for t in tanks:
    print('{} is {}'.format(tanks[t]['name'], tanks[t]['mode']))

结果如下:

Tank A is clean
Tank B is dirty
updating Tank A mode...
Tank A is dirty
Tank B is dirty

字典看起来像这样:

{'tankA': {'name': 'Tank A', 'mode': 'dirty'}, 'tankB': {'name': 'Tank B', 'mode': 'dirty'}}

然后您可以根据自己的逻辑,创建以某些方式更新字典的方法。

希望这会有所帮助。

答案 1 :(得分:0)

通过在每个循环中重新定义dict,您每次都在调用类方法,因此所有Tank实例都以相同的mode结尾。您可以通过简单的if...else...而不是dict来避免这种情况。 这将作为您的while循环:

while i < 2:
    if tankList[i].mode == 'dirty':
        tankList[i].dirty()
    elif tankList[i].mode == 'clean':
        tankList[i].clean()
    print(tankList[i].mode)
    i += 1

根据需要输出:

Tank A is clean
dirty
Tank B is dirty
clean