2015-09-28 4 views
2

Как я использую Python 2.6 Я пытаюсь создать собственный класс Enum. Мне нужно сохранить строку с объектом enum. Что-то вроде:Iterable enum in Python 2.6

class Enum(object): 
    def __init__(self, value): 
     self.value = value[0] 
     self.msg = value[1] 

class Parameters(Enum): 
    SERVER_LISTEN_ADDRESS = (0, "http://blabla.com") 
    SERVER_LISTEN_PORT = (1, "7001") 
    SERVER_SSL_LISTEN_PORT = (2, "7002") 
    (...) # many parameters more 
    SERVER_NAME = (X, "name") 

Проблема заключается в том, что мой класс «Parameters» не итерацию ... Из другого файла мне нужно, чтобы иметь возможность перебирать среди Params:

import Parameters 

for param in Parameters: 
    # do sth 

К сожалению, для моего решение У меня есть ошибка: for param in Parameters: TypeError: 'type' object is not iterable.

ответ

1
for param in Parameters: 
    # 

Выше не будет работать, потому что Parameters это класс, и это не итерацию.

class Parameters(Enum): 
    PARAM1 = (0, "some msg 1") 
    PARAM2 = (1, "some msg 2") 

PARAM1 и PARAM2 являются класса переменных в вышеописанном случае.


Мы должны сделать что-то вроде этого:

class Enum(object): 
    def __init__(self, value): 
     self.value = value[0] 
     self.msg = value[1] 

class Parameters(Enum): 
    def _init__(self, value): 
     super.__init__(value) 

PARAM1 = (0, "some msg 1") 
PARAM2 = (1, "some msg 2") 
for param in [PARAM1, PARAM2]: 
    print Parameters(param) 

[Edit 1]:

Создать количество объектов, для петли с функцией расстояния

код :

for i in range(100): 
    param = (i, "some mesg %s"%i) 
    print Parameters(param) 

[Изменить 2]:

Получить значение от пользователя по raw_input функциям и типа преобразования из строки в целое

Демонстрации:

>>> no = raw_input("Enter Number of objects you want to create(Give only number): ") 
Enter Number of objects you want to create(Give only number): 33 
>>> no 
'33' 
>>> type(no) 
<type 'str'> 
>>> no_int = int(no) 
>>> type(no_int) 
<type 'int'> 

Примечания:

использование raw_input() в Python 2.x

использования input() в Python 3.x

[Edit 3]: значения методом жестко переменных экземпляра.

Определить класс в файле hardcoded_values.py

class Hardcodes(): 
    def __init__(self,): 
     self.para1 = (1, "some msg 1") 
     self.para2 = (2, "some msg 2") 
     self.para3 = (3, "some msg 3") 
     self.para4 = (4, "some msg 4") 

Импорт Hardcodes класс test.py файл

#- Create Object(instance) 
from hardcoded_values import Hardcodes 
obj = Hardcodes() 
hardcode_values = obj.__dict__ 
for i in hardcode_values.iteritems(): 
    print i 

Выход:

$ python test.py 

('para3', (3, 'some msg 3')) 
('para2', (2, 'some msg 2')) 
('para1', (1, 'some msg 1')) 
('para4', (4, 'some msg 4')) 
+0

Спасибо! Есть ли способ сделать: 'для параметра в [PARAM1, PARAM2]' независимо от имен PARAM? – Konrad

+0

означает, что я не получаю. 'PARAM1' и' PARAM2' являются переменными типов 'tuple'. Вы имеете в виду, что вам нужно генерировать больше переменных, например 'PARAM1'? –

+0

Я имею в виду, что у меня может быть много ПАРА (f.g PARAM1 - ... - PARAM101), и я хотел бы иметь возможность выполнять итерацию на каждом PARAM, не зная его имени – Konrad

3

Используйте портированном enum модуль (documentation):

from enum import Enum 


class Parameters(Enum): 
    PARAM1 = (0, "some msg 1") 
    PARAM2 = (1, "some msg 2") 

for i in Parameters: 
    print(i, '=', i.value) 

который печатает:

Parameters.PARAM1 = (0, 'some msg 1')

Parameters.PARAM2 = (1, 'some msg 2')

+0

Эй, Йошуа! Но я использую Python 2.6 – Konrad

+0

Привет, я думаю, что он также доступен для Python 2.6. Мне любопытно, почему, почему вы используете Python 2.6 вместо Python 2.7. Разве они не совместимы (т. Е. Вы могли бы заменить старую версию более новой без каких-либо последствий)? Кстати. Вы в Windows или Linux? – Joschua

+0

К сожалению, я не могу изменить среду, над которой я работаю: <Она должна быть совместима со многими машинами в нашей сети, и там у меня есть только Python 2.6. Я нахожусь в Linux – Konrad