-1

p我正在编写一些不重要的代码,但我想做的一件事是从另一个类中调用一个函数,然后将类名从列表中拉出并放入变量中。请注意,在过去的两周里,我实际上刚刚学习了 python,并且几乎不知道如何编程。

我认为这应该做的是当调用 getattr() 时,它将传递包含在相应类中的属性“run_question”,该属性与 question_type 中的名称相同,然后将其传递给“running_question”。我知道可能有更好的方法来做我正在尝试的事情,但我想知道为什么这种方法不能像我认为的那样起作用。

 #! /usr/bin/python
 rom random import randrange

 class QuestionRunner(object):
     def __init__(self):
         ##initialize score to zero
         self.score = 0
         ##initialize class with the types of questions
         self.questiontypes = ['Addition', 'Subtraction', 'Division', 'Multiplication']
     ##randomly selects question type from self.questiontypes list    
     def random_type(self):
         type = self.questiontypes[randrange(0, 4)]
         return type
     ##question function runner, runs question function from self
     def run_questions(self):
         try:
             question_type = self.random_type()
             running_question = getattr(question_type, 'run_question' )
         except AttributeError:
             print question_type
             print "Attribute error:Attribute not found"
         else: running_question()

 class Question(object):
     pass 


 class Multiplication(Question):
     def  run_question(self):
         print "*" 

 class Division(Question):
     def run_question(self):
         print "/"

 class Subtraction(Question):
     def run_question(self):
         print "-"

 class Addition(Question):
     def run_question(self):
         print "+"



 test = QuestionRunner()

 test.run_questions()

这输出:

[david@leonid mathtest] :( $  python mathtest.py  
Division
Attribute error:Attribute not found
[david@leonid mathtest] :) $

这表明我没有得到我期望的 run_question 属性。

我应该注意,当我按以下方式将函数放入 QuestionRunner 类时,一切都按预期工作。我使用真正不需要的类的主要原因是它实际上可以很好地掌握如何让它们做我想做的事情。

#! /usr/bin/python
from random import randrange

class QuestionRunner(object):
    def __init__(self):
        ##initialize score to zero
        self.score = 0
        ##initialize class with the types of questions
        self.questiontypes = ['addition', 'subtraction', 'division', 'multiplication']
    ##randomly selects question type from self.questiontypes list    
    def random_type(self):
        type = self.questiontypes[randrange(0, 4)]
        return type
    ##question function runner, runs question function from self
    def run_questions(self):
        try:
            question_type = self.random_type()
            running_question = getattr(self, question_type)
        except AttributeError:
            exit(1)
        else: running_question()


    def  multiplication(self):
        print "*"


    def division(self):
        print "/"


    def addition(self):
        print "+"


    def subtraction(self):
        print "-"




test = QuestionRunner()

test.run_questions()

关于为什么这不起作用的任何帮助都会很棒,我非常感谢。

关于为什么这不起作用的任何帮助都会很棒,我非常感谢。

4

1 回答 1

0

啊,我发现了导致我的逻辑错误的缺失概念。我假设我可以将对象的名称传递给 getattr,而实际上我必须传递对象本身。

于 2012-09-09T16:40:11.393 回答