在Python中运行时创建对象

时间:2011-01-18 16:35:11

标签: python oop concept

在运行时创建对象时,我有一个掌握OOP概念的问题。我所研究的所有教育代码都定义了特定的变量,例如: 'Bob'并将它们分配给一个新的对象实例。 Bob = Person()

我现在理解的是如何设计一个在运行时创建新对象的模型?我知道我的短语可能有问题,因为所有对象都是在运行时生成的,但我的意思是,如果我要在终端或UI中启动我的应用程序,我将如何创建新对象并对其进行管理。我无法动态定义新的变量名称吗?

我遇到此设计问题的示例应用程序将是存储人员的数据库。用户获得终端菜单,允许他创建新用户并分配姓名,工资,职位。如果你想管理它,调用函数等,你将如何实例化该对象并稍后调用它?这里的设计模式是什么?

请原谅我对OPP模型的不了解。我正在阅读课程和OOP,但我觉得在继续学习之前我需要了解我的错误。如果有任何我需要澄清的内容,请告诉我。

5 个答案:

答案 0 :(得分:7)

列表或词典之类的东西非常适合存储动态生成的值/对象集:

class Person(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        print "A person named %s" % self.name

people = {}
while True:
    print "Enter a name:",
    a_name = raw_input()

    if a_name == 'done':
        break

    people[a_name] = Person(a_name)

    print "I made a new Person object. The person's name is %s." % a_name

print repr(people)

答案 1 :(得分:2)

您不会使用变量名存储每个对象。变量名称是为了方便程序员。

如果你想要一个对象集合,你只需使用它 - 一个集合。使用包含对象实例的列表或字典,分别由索引或键引用。

因此,例如,如果每个员工都有员工编号,您可以将他们保存在字典中,并将员工编号作为密钥。

答案 2 :(得分:1)

对于您的示例,您希望使用模型抽象。

如果Person是模型类,您只需执行以下操作:

person = new Person()
person.name = "Bob"
person.email = "bob@aol.com"
person.save()  # this line will write to the persistent datastore (database, flat files, etc)

然后在另一个会话中,您可以:

person = Person.get_by_email("bob@aol.com") # assuming you had a classmethod called 'get_by_email'

答案 3 :(得分:1)

我会尽力回答:

  1. 您要问的是变量名称 - 这不是Python中的。 (我认为它在VB.Net中,但不要让我这样做)
  2.   

    用户获得一个终端菜单,允许他创建一个新用户并分配名称,工资,职位。如果你想管理它,调用函数等,你将如何实例化该对象并稍后调用它?这里的设计模式是什么?

    这是我添加新人的方式(米老鼠示例):

    # Looping until we get a "fin" message
    while True:
        print "Enter name, or "fin" to finish:"
        new_name = raw_input()
        if new_name == "fin":
            break
        print "Enter salary:"
        new_salary = raw_input()
        print "Enter position:"
        new_pos = raw_input()
    
        # Dummy database - the insert method would post this customer to the database
        cnn = db.connect()
        insert(cnn, new_name, new_salary, new_pos)
        cnn.commit()
        cnn.close()
    

    好的,所以你现在想要从数据库中找到一个人。

    while True:
        print "Enter name of employee, or "fin" to finish:"
        emp_name = raw_input()
        if emp_name == "fin":
            break
        # Like above, the "select_employee" would retreive someone from a database
        cnn = db.connect()
        person = select_employee(cnn, emp_name)
        cnn.close()
    
        # Person is now a variable, holding the person you specified:
        print(person.name)
        print(person.salary)
        print(person.position)
    
        # It's up to you from here what you want to do
    

    这只是一个基本的,粗略的例子,但我认为你理解我的意思。

    此外,正如您所看到的,我没有在这里使用课程。类似这样的类几乎总是一个更好的主意,但这只是为了演示如何在运行时更改和使用变量。

答案 4 :(得分:0)

你永远不会在真实的节目中做Bob = Person()。任何显示这可能是一个坏例子的例子;它本质上是硬编码。您将更频繁地(在实际代码中)执行person = Person(id, name)或类似的事情,使用您在其他地方获得的数据构建对象(从文件中读取,从用户交互接收等)。更好的是employee = Person(id, name)