【问题标题】:Creating objects during runtime in Python在 Python 运行时创建对象
【发布时间】:2011-06-11 05:19:23
【问题描述】:

在运行时创建对象时,我无法理解 OOP 概念。我研究过的所有教育代码都定义了特定的变量,例如'Bob' 并将它们分配给一个新的对象实例。鲍勃 = 人()

我现在难以理解的是如何设计一个在运行时创建新对象的模型?我知道我的措辞可能有问题,因为所有对象都是在运行时生成的,但我的意思是,如果我要在终端或 UI 中启动我的应用程序,我将如何创建新对象并管理它们。我真的不能即时定义新的变量名吗?

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

请原谅我对 OPP 模型的理解不佳。我目前正在阅读课程和 OOP,但我觉得在继续之前我需要了解我的错误是什么。如果有什么我需要澄清的,请告诉我。

【问题讨论】:

  • 为什么要将自定义名称作为变量名称?
  • 您实际上了解创建对象。您只需要了解更多关于容器(例如列表、集合和字典)的信息。
  • 每当有人谈到一个对象的“名称”时,我都会强烈地想添加一个confusion-of-ideas 标签;)对象没有名称。有变量,它们指的是对象。但这不是 1:1 的关系——许多变量可以引用一个对象,而对象不必由变量引用。它们是非常不同的东西。

标签: python oop concept


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我已经预感到会是这样。感谢您的解释,非常有帮助
    【解决方案3】:

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

    如果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'
    

    【讨论】:

    • 感谢您提供的参考示例。我认为它看起来像这样
    【解决方案4】:

    我会尽量在这里回答:

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

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

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

    # 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
    

    这只是一个基本的粗略示例,但我想你明白我的意思。

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

    【讨论】:

      【解决方案5】:

      你永远不会在真正的程序中使用Bob = Person()。任何表明这一点的例子都可以说是一个坏例子;它本质上是硬编码。您将更经常(在实际代码中)执行person = Person(id, name) 或类似的操作,以使用您在其他地方获得的数据(从文件读取、从用户交互接收等)构造对象。更好的是employee = Person(id, name)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-03
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多