Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中运行时创建对象_Python_Oop_Concept - Fatal编程技术网

在Python中运行时创建对象

在Python中运行时创建对象,python,oop,concept,Python,Oop,Concept,在运行时创建对象时,我很难理解OOP的概念。我研究过的所有教育代码都定义了特定的变量,例如“Bob”,并将它们分配给一个新的对象实例。鲍勃=人() 我现在很难理解的是如何设计一个在运行时创建新对象的模型?我知道我的措辞可能是错误的,因为所有对象都是在运行时生成的,但我的意思是,如果我要在终端或UI中启动我的应用程序,我将如何创建新对象并管理它们。我不能即时定义新的变量名,对吗 我遇到这个设计问题的一个示例应用程序是存储人员的数据库。用户将获得一个终端菜单,该菜单允许他创建一个新用户并分配姓名、薪

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

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

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


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

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

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)

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

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

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

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


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

我将在这里尽力回答:

  • 您要问的是变量名——这不是Python中的。(我认为它在VB.Net中,但不要让我这么认为)
  • 用户将获得一个终端菜单,该菜单允许他创建一个新用户并分配姓名、薪水和职位。如果您想管理该对象、调用函数等,您将如何实例化该对象并稍后调用它。?这里的设计模式是什么

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

    好的,现在您想从数据库中获取一个人

    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
    
    这只是一个基本的、粗略的例子,但我想你明白我的意思了


    另外,正如你所看到的,我在这里没有使用类。为类似的内容创建一个类通常是一个更好的主意,但这只是为了演示如何在运行时更改和使用变量。

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

    为什么您希望自定义名称成为变量名?您实际上理解了创建对象。首先,你只需要学习更多关于容器的知识,比如列表、集合和字典。每当有人提到一个对象的“名称”,我都会强烈地想添加一个概念混乱的标签对象没有名称。有变量,它们引用对象。但这不是1:1的关系-许多变量可以引用一个对象,而对象不必由变量引用。它们是非常不同的东西。我已经预感到会是这样。谢谢你的解释,非常有用谢谢你的参考例子。我以为会是这样的
    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