2015-02-02 1 views
0

Это всего лишь принцип. Я бы хотел, чтобы атакованная битовая версия была обновлена, когда одна из атак битов (рыцарь, слон или пешка) была изменена без повторения строки 1. Возможно ли это? Каков наилучший способ сделать это? В классе класса borg или просто с использованием поведения словарей:обновление бит бит-доски при обновлении одной атаки

  1. attacked = pawn_attacks | Рыцарь смерти | bishop_attacks

  2. pawn_attacks = (1 < < (pawn + 9)) | (1 < < (пешка + 7))

Это не работает прозрачно/автоматически, когда один из изменений атак. Ниже результат атакован всегда 1.

class Test(object): 
    def __init__(self): 
     self.pawn_attacks = 0 
     self.knight_attacks = 0 
     self.bishop_attacks = 0 

    @property 
    def attacked(self): 
     return self.pawn_attacks | self.knight_attacks | self.bishop_attacks 

test = Test() 
test.pawn_attacks = 1 
print test.attacked 
test.pawn_attacks = 2 
print test.attacked 

ответ

0

Если вы пишете класс, вы можете сделать attacked а (только для чтения) свойства, так что становится прозрачно пересчитывается в необходимости:

... rest of the class ... 

@property 
def attacked(self): 
    return self.pawn_attacks | self.knight_attacks | self.bishop_attacks 

Теперь данный экземпляр x класса, x.attacked всегда будет в курсе событий (кэширование только для повторной компромиссы, если это необходимо, не является оправданным, учитывая, что операция настолько элементарна в любом случае).

Если вы не хотите заниматься классом, вам нужно будет сделать attacked специально функцией , чтобы получить ту же идею. Однако, хотя Python не заставляет вас использовать классы так, как это делают некоторые другие языки, тем не менее, используя классы, когда они обеспечивают структуру и/или удобство, как здесь, все еще хорошая идея :-)

+0

Спасибо. Да, конечно. Я просто вникаю в сложность дескриптора. – user2718378

+0

На самом деле это не работает и/или я сам себя плохо объяснил. Я добавил код выше. Я что-то упускаю? – user2718378

+0

Вы назначаете 'test.pawn_attacked = 2' и что **' pawn_attacked' ** (в отличие от ** ** 'pawn_attacks' **, назначенного ранее и используемого и назначенного повсюду) атрибут никогда не используется или не упоминается снова нигде в ваш код; что вы ожидали ** в результате такого присвоения атрибута, атрибуту, не связанному ни с чем другим, упомянутым ни в вопросе, ни в ответе ?! Я подозреваю, что это опечатка, и в этом случае возникает очевидный вопрос, как ** ваша ** опечатка недействительна ** мой ** ответ, молитесь? –