2010-11-19 5 views
0

Я пишу игру-мошенник в Python и определяю свой класс Tile. Плитка может быть заблокирована, стена или пол. Я хотел бы быть в состоянии написать что-то вдоль линийPython User-Defined Data Type

self.state = Blocked 

подобно тому, как вы будете использовать логическое значение (но с тремя значениями).

Есть ли хороший способ определить тип данных, чтобы я мог это сделать?

Благодаря

ответ

4

Для три констант, я хотел бы использовать распаковку версию перечислений «шаблон»:

Blocked, Wall, Floor = range(3) 

Если она становится более сложной, чем это, хотя, я бы взглянуть на других enum types in python ,

+2

Нет необходимости использовать кортеж (диапазон (3)) в Python 3 - назначение кортежа генератору отлично работает (я только что протестировал его). –

+0

@ Крис, спасибо. исправлено. – aaronasterling

0
class State: 
    Blocked=1 
    Wall=2 
    Floor=3 

some = State.Blocked 
+0

Вторая версия [третьего ответа] (http://stackoverflow.com/questions/36932/whats-the-best-way-to-implement-an-enum-in-python/1695250#1695250) __way__ лучше ИМО. Он заканчивается тем же результатом, что и этот, но гораздо менее подвержен ошибкам. – aaronasterling

0

Использовать битовые флаги. Вы можете выполнить поиск в google для получения дополнительной информации. Проще говоря, вы можете хранить логические значения в двоичной форме, так как True/False - это один бит, вы можете сделать 4 бита или 1 байт для хранения 4 разных логических элементов.

Так скажем так:

синтаксис питона:
a = 0x0 # [это питон представление битового флага или двоичного числа <class 'int'> или python27 <type 'int'>]

двоичное представление:
0x0 = 000 [ноль равен нулю, не имеет значения, сколько времени имеет двоичная переменная]
0x1 = 001 [1]
0x2 =[2]
0x4 = 100 [4]
так что здесь мы имеем 3 или более различных логических мест, которые мы можем проверить, с момента 000000000001 == 001 == 01 == 0x1

но в битовых флагов
0x3 = 011 [3 = 2 + 1]
0x5 = 101 [5 = 4 + 1]
0x6 = 110 [6 = 4 + 2]
0x7 = 111 [7 = 4 + 2 + 1]

В САМЫЕ ПРОСТОЙ ТЕРМИНЫ Я дам вам один синтаксис сравнения &, что означает И, это означает, что место «1» в битовом флаге должно быть одинаковым. Таким образом, в практическом плане 0x1 & 0x2 == 0x2 будет Ложное, потому что 001 & 010 не имеет значение «1» в том же месте

, так что если вы хотите, чтобы проверить на два типа в битовом флаг просто добавить их вместе и проверить, с синтаксисом выше.
пример: 0x3&(0x1+0x2)==(0x1+0x2)

Надеюсь, это поможет. Счастливый гуглинг.