Компиляция объектов класса Python в список - PullRequest
1 голос
/ 19 марта 2019

Я пытаюсь научиться автоматически компилировать всех членов класса в список. Этот сегмент кода не является частью реального проекта, но является лишь примером, который поможет мне объяснить мою цель. Я не могу найти какой-либо материал для чтения по этому поводу, и я даже не знаю, возможно ли это или нет. Заранее спасибо за ваши ответы! =) * * Тысяча одна

class question:
    def __init__(self,question,answer,list_of_answers):
        self.question=question
        self.answer=answer
        self.list_of_answers=list_of_answers

question_01=question('''
Which of these fruits is red?
A). Banana
B). Orange
C). Apple
D). Peach
''',"C",("A","B","C","D"))

question_02=question('''
Which of these is both a fruit and a vegetable?
A). Cauliflower
B). Tomato
C). Brocolli
D). Okrah
''',"B",("A","B","C","D"))

'''My objective is to write code that can automatically compile my questions (the
members of my question class) into a list,even if I have hundreds of them, without
having to manually write them into a list.'''

#If there are only two questions, final output should automatically become:
all_questions=[question_01,question_02]

#If there are one hundred questions, final output should automatically become:
all_questions=[question_01,question_02, ... ,question_99,question_100]

#Without having to manually type all of the one hundred questions (or members
#of the question class) to the list.

Ответы [ 3 ]

3 голосов
/ 19 марта 2019

Во-первых, у вас не должно быть переменных от 100 question_01 до question_100.У вас будет плохое время, когда вы захотите изменить порядок вопросов, или удалить один, или добавить один в середине.Вы действительно хотите переименовать 98 переменных, когда хотите поместить новый вопрос между question_02 и question_03?

На этом этапе вам настоятельно рекомендуется поместить ваши вопросы в файл данных отдельно отВаш исходный код и чтение вопросов из файла.Даже если вы этого не сделаете, вы должны исключить пронумерованные переменные.Поместите вопросы в список для начала.(Также, классы должны быть названы в CamelCase):

questions = [
    Question('''
Which of these fruits is red?
A). Banana
B). Orange
C). Apple
D). Peach
''', "C", ("A","B","C","D")),
    Question('''
Which of these is both a fruit and a vegetable?
A). Cauliflower
B). Tomato
C). Brocolli
D). Okrah
''', "B", ("A","B","C","D")),
    ...
]
0 голосов
/ 20 марта 2019

Оба ответа были очень хорошими.Я хотел бы, чтобы я мог выбрать оба из них в качестве основного ответа.Я передал его mm_, потому что его ответ наиболее соответствовал моим целям, но мне очень нравится и ответ user2357112.

Спасибо за ответы всем!

0 голосов
/ 19 марта 2019

Есть способ сделать то, что вы хотели: получить список всех объектов данного типа из модуля (или файла).Я представляю два решения:

Вариант один, из другого модуля (файла):

Допустим, у вас есть следующий файл:

QuestionModule.py

 class question:
    def __init__(self,question,answer,list_of_answers):
    self.question=question
    self.answer=answer
    self.list_of_answers=list_of_answers

 question_01=question('''
 Which of these fruits is red?
 A). Banana
 B). Orange
 C). Apple
 D). Peach
 ''',"C",("A","B","C","D"))

 question_02=question('''
 Which of these is both a fruit and a vegetable?
 A). Cauliflower
 B). Tomato
 C). Brocolli
 D). Okrah
 ''',"B",("A","B","C","D"))

Тогда вы можете получить все вопросы:

GetQuestions.py

import QuestionModule
def get():
    r = []
    for attribute in dir(QuestionModule):
        #print(attribute,"  ",type(getattr(QuestionModule,attribute)))
        if type(getattr(QuestionModule,attribute)) == QuestionModule.question:
            r.append(getattr(QuestionModule,attribute))  
    return r

l_questions = get()

Или:

import GetQuestions
l_questions = GetQuestions.get()

Второй вариант из одного и того же модуля (файла):

Если вы хотите сделать то же самое из того же файла, вы можете сделать:

 class question:
    def __init__(self,question,answer,list_of_answers):
    self.question=question
    self.answer=answer
    self.list_of_answers=list_of_answers

 question_01=question('''
 Which of these fruits is red?
 A). Banana
 B). Orange
 C). Apple
 D). Peach
 ''',"C",("A","B","C","D"))
 question_02=question('''
 Which of these is both a fruit and a vegetable?
 A). Cauliflower
 B). Tomato
 C). Brocolli
 D). Okrah
 ''',"B",("A","B","C","D"))

def getQuestions():
    import sys
    l = dir(sys.modules[__name__])
    r = []
    for e in l:
        if sys.modules[__name__].question==type(getattr(sys.modules[__name__],e)):
            r.append(getattr(sys.modules[__name__], e))
    return r

L = getQuestions()
for i in L :
    print(i)
    print(i.question)

Вы можете извлечь import sys из метода и поместить его наверх, еслиВы должны позвонить getQuestions несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...