Быстрая модификация объекта с помощью dict в Python - PullRequest
0 голосов
/ 05 октября 2018

Я довольно новичок в программировании и пытаюсь найти наиболее эффективный способ итерации объекта для обновления его состояния с каждым проходом.Я думал, что смогу использовать словарь в Python 3.6 для запуска кода в объекте.Я надеялся увидеть вывод, который гласит:

Tank A is clean    
dirty    
Tank B is dirty    
clean

и в итоге будет переключен режим объектов танка.Почему это не работает, и каков наиболее эффективный способ выбрать правильную защиту из созданного танка для запуска?

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 голосов
/ 05 октября 2018

Переопределяя 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
0 голосов
/ 05 октября 2018

Вам не обязательно нужен класс.Вы всегда можете просто держать все свои танки в диктовке и обновлять / отображать состояние своих танков, используя эти свойства.

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'}}

Затем можно создать методы для обновления своего диктата определенным образом на основе вашей собственной логики.

Надеюсь, это поможет.

...