在Python中运行时创建对象

3 投票
5 回答
6716 浏览
提问于 2025-04-16 10:11

我在理解面向对象编程(OOP)这个概念时遇到了一些问题,特别是在运行时创建对象的时候。我看过的所有教学代码都定义了特定的变量,比如说“Bob”,然后把它们分配给一个新的对象实例。比如:Bob = Person()

我现在困惑的是,如何设计一个模型,在运行时创建一个新对象?我知道我的说法可能不太准确,因为所有对象都是在运行时生成的,但我的意思是,如果我在终端或用户界面启动我的应用程序,我该如何创建新对象并管理它们呢?我不能随便定义新的变量名,对吧?

一个我遇到这个设计问题的例子是一个存储人员信息的数据库。用户会看到一个终端菜单,可以创建一个新用户,并为其分配姓名、薪水和职位。那我该如何实例化这个对象,之后又该如何调用它,以便管理、调用函数等等?这里的设计模式是什么?

请原谅我对OOP模型理解得不够透彻。我现在正在学习类和面向对象编程,但我觉得在继续之前,我需要弄清楚我在这里的错误是什么。如果有什么需要我澄清的,请告诉我。

5 个回答

1

我会尽量把这个问题解释得简单明了:

  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

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

另外,你可以看到,我这里并没有使用类。对于这种情况,使用类通常会是个更好的主意,但我只是想演示一下在运行时如何改变和使用一个变量。

2

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

如果你想要存放一组对象,就应该用集合。可以使用列表或者字典来存放对象实例,列表是通过索引来访问,而字典是通过键来访问。

举个例子,如果每个员工都有一个员工编号,你可以把他们放在一个字典里,用员工编号作为键。

8

像列表或字典这样的东西非常适合用来存储动态生成的一组值或对象:

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)

撰写回答