Python-通过函数传递类,导致错误

Python-通过函数传递类,导致错误,python,class,Python,Class,我一直在编写一段代码,试图将一个类从一个函数传递到另一个函数(代码在其他方面也有缺陷,但这些都不是重要的)。主要问题是,如果您在enter函数中定义了一个类,则会出现以下错误: exec("""print({}.Show())""".format(x)) File "<string>", line 1, in <module> NameError: name (whatever I have called the class title) is not def

我一直在编写一段代码,试图将一个类从一个函数传递到另一个函数(代码在其他方面也有缺陷,但这些都不是重要的)。主要问题是,如果您在
enter
函数中定义了一个类,则会出现以下错误:

    exec("""print({}.Show())""".format(x))
  File "<string>", line 1, in <module>
NameError: name (whatever I have called the class title) is not defined

您首先不应该使用
exec
。我会使用字典来存储各种对象,这样您就可以按名称查找它们。例如,可以使用
customers
字典来创建您的客户:
customer=customers[name]=customer(姓名、地址、电话号码)
(根本不需要
init2
方法),然后使用
customer.地毯数量(地毯类型、把手)
customer.price(尺寸、周长)
customer
本地名称可用于调用对象上的方法,您可以稍后使用
customers[name]
在其他函数中检索对象。您的问题源于尝试访问
enter()
中定义的变量;这些不是全球性的。在
enter()
中,它们甚至不是真正的本地名,因为
exec()
不能设置新的本地名。你真的把自己画进了一个角落。
import pickle
import traceback
import sys
classtitles = []
class Customer(object):
    def __init__(self):
        try:
            self.load()
            print(self.customer)
        except:
            None

    def init2(self,customer_name,home_address,telephone_number):
        self.customer = customer_name
        self.address = home_address
        self.phone = telephone_number
        print(self.customer)
        classtitles.append(self.customer)

    def carpet_amounts(self, carpet_type, grippers_bool):
        self.type = carpet_type
        self.grippers = grippers_bool

    def price(self, size, perimeter):
        self.size = size
        self.perimeter = perimeter
        self.price = 0
        if self.type == "First":
            self.price = float(5.99) * self.size
        if self.type == "Monarch":
            self.price = float(7.99) * self.size
        if self.type == "Royal":
            self.price = int(60) * self.size
        price_add = float(22.5) * self.size
        if self.grippers == True:
            price_add += self.perimeter * float(1.10)
        hours = 0
        while size >= 16:
            hours += 1
            size -= 16
        self.hours = hours
        price_add += hours * 65
        self.price += price_add
    def Show(self):
        print("show")
        if self.grippers == True:
            grips = "with"
        else:
            grips = "without"
        return ("the size is {}m^2 and with a {} undercarpet and {} grippers, totalling more than {} hours of work is {}".format(self.size,self.type,grips,self.hours,self.price))

    def save(self):
        """save class as self.name.txt"""
        file = open('ClassSave.txt','wb')
        file.write(pickle.dumps(self.__dict__))
        file.close()

    def load(self):
        """try load self.name.txt"""
        file = open('ClassSave.txt','r')
        datapickle = file.read()
        file.close()

        self.__dict__ = pickle.loads(dataPickle)


def loadf():
    f = open('classnames.txt','r')
    mylist = f.read().splitlines()
    for x in mylist:
        exec("""{} = Customer()""".format(mylist[0]))
    customs()




def customs():
    try1 = input("Would you like to 1. Enter a new customer. 2. View all the customers. 3. Delete an old customer")
    if try1 == '1':
        enter()
    elif try1 == 'q':
        sys.exit()
    else:
        tr()


def enter():
    name = input("What is thr customers name (no space i.e. 'JoeBloggs')? ")
    address = input("What is their address")
    phonenumber = str("What is their phone number")
    exec("""{} = Customer()""".format(name))
    exec("""{}.init2("{}","{}","{}")""".format(name,name,address,phonenumber))
    print(classtitles)
    carpet_type = input("What type of carpet would they like ('First','Monarch','Royal')? ")
    grips = str(input("Would they like grips (1 = yes, 2 = no)? "))
    if grips == '1':
        grips = True
    else:
        grips = False        
    exec("""{}.carpet_amounts("{}",{})""".format(name,carpet_type,grips))
    size = int(input("What is the m^2 size of their carpet? "))
    perimeter = int(input("What is the m perimeter of their carpet? "))
    exec("""{}.price({},{})""".format(name,size,perimeter))
    exec("print({}.Show())".format(name))
    file2 = open('classnames.txt','w')
    for x in classtitles:
        file2.write(x)
    file2.close()
    exec("{}.save()".format(name))
    customs()

def tr():
    x = input("name")
    print(x)
    exec("""print({}.Show())""".format(x))
    customs()



loadf()