Python 如果属性不存在,则创建一个属性并为其指定默认值

Python 如果属性不存在,则创建一个属性并为其指定默认值,python,exception-handling,try-catch,attributeerror,Python,Exception Handling,Try Catch,Attributeerror,我从一本书中学习Python,并为自己编写了一个长时间的测验/类型游戏,最后打印了一个摘要。但是,根据用户所做的选择,摘要会查找不总是存在的属性 我已将其抽象为一个基本示例,以说明我正在尝试做什么。本质上,我只想运行一个属性错误检查,对于没有属性的每个变量,创建一个默认值为N/a的属性 在下面的示例中,我希望它能够打印: 名字:乔 姓:布洛格斯 史密斯测试:不适用 测试4:不适用 我创建了一个名为CodeCleaner的类,我打算用它来设置N/a值,但它被卡住了 class QuestionSe

我从一本书中学习Python,并为自己编写了一个长时间的测验/类型游戏,最后打印了一个摘要。但是,根据用户所做的选择,摘要会查找不总是存在的属性

我已将其抽象为一个基本示例,以说明我正在尝试做什么。本质上,我只想运行一个属性错误检查,对于没有属性的每个变量,创建一个默认值为N/a的属性

在下面的示例中,我希望它能够打印:

名字:乔 姓:布洛格斯 史密斯测试:不适用 测试4:不适用

我创建了一个名为CodeCleaner的类,我打算用它来设置N/a值,但它被卡住了

class QuestionSet(object):
    next_set = 'first_set'

class ClaimEngine(QuestionSet):

    def current_set(self):
        last_set = "blank"
        while_count = int(0)
        quizset = Sets.subsets
        ParentSet = QuestionSet()
        while ParentSet.next_set != last_set and int(while_count)<50:
            quizset[ParentSet.next_set].questioning()
            while_count = while_count+1

class FirstSet(QuestionSet):

    def questioning(self):
        self.value1 = raw_input("Forename:\n")
        QuestionSet.next_set = "second_set"

class SecondSet(QuestionSet):

    def questioning(self):
        self.value2 = raw_input("Surname:\n")
        if self.value2 == "Smith":
            self.value3 = "He's a Smith!"
            self.value4 = "Test val 4"
            QuestionSet.next_set = "summary"
        else: 
            QuestionSet.next_set = "summary"

class CodeCleaner(QuestionSet):

    def questioning(self):
        mapping = Sets() 
        sets = mapping.subsets
        variable_list = {
        [sets['first_set']].value1,
        [sets['second_set']].value2,
        [sets['second_set']].value3,
        [sets['second_set']].value4
        }
        #while key_no < 4:
        #   try:
        #       print variable_list
        #   except AttributeError:


class Summary(QuestionSet):

    def questioning(self):
        mapping = Sets() 
        sets = mapping.subsets
        print "Forename:",sets['first_set'].value1
        print "Surname:",sets['second_set'].value2
        print "Smith Test:",sets['second_set'].value3
        print "Test 4:",sets['second_set'].value4
        exit(0)

class Sets(object):
        subsets = {
        'first_set': FirstSet(),
        'second_set': SecondSet(),
        'summary': Summary()
        }

run = ClaimEngine()
run.current_set()
类问题集(对象):
下一个集合='第一个集合'
课程分类引擎(问题集):
def当前_设置(自身):
最后一组=“空白”
而_count=int(0)
quizset=set.subset
ParentSet=QuestionSet()

而ParentSet.next_set!=last_set和int(while_count)我不确定是否完全符合您的方法,但您可以在一个对象中实现一个
\uuu getattr\uuuu
方法,当找不到属性时将调用该方法:

class A(object):
    def __getattr__(self, name):
        print("Creating attribute %s."%name)
        setattr(self, name, 'N/A')
然后:


为什么不将初始化属性设置为“无”?您需要阅读更多关于类的内容,因为您没有正确使用它们。它们本质上是用于创建对象实例的模板,这些对象包含特定类型的信息和一组预定义的对其进行操作的函数,而不是容器对象本身(显然您正试图这样做)。
>>> a = A()
>>> a.a
Creating attribute a.
>>> a.a
'N/A'