关于面向对象编程和持久化的初学者概念性问题

6
这是一个关于面向对象编程(OOP)的非常基础的问题(我使用Python,但实际上这是一个概念性问题,因此不是特定于语言的)。我已经查看了一些教程和书籍,但没有涵盖这个具体问题的。如果我的表述不清楚,我很抱歉并愿意澄清任何我写过的东西。
假设我正在创建一个简单的地址簿,并希望使用pickle将其写入磁盘。我有一个名为“Contact”的类,其中“__init__”接受一些参数(firstName和lastName),我有一个菜单,您可以在其中创建联系人、编辑它们等等。对于我看到的所有OOP示例,他们会做类似以下的事情...
bob = Contact('Bob', 'Smith') 
jane = Contact('Jane', 'Smith')

...创建新的联系人实例。但是这些都是在运行之前定义好的。如果我希望所有这些实例都由用户输入时动态创建,该怎么办?我是否需要为每个人创建新的实例?如何从用户输入中完成这个操作呢?是将所有实例写入一个列表并进行pickling吗?还是要做一些像...

firstName, lastName = raw_input("Enter first name: "), raw_input("Enter last name: ")    
contact = Contact(firstName, lastName)

那么,我只需要将联系人添加到列表中,并在每次想添加用户时获取联系人实例的新值吗?这是一个关键的概念,我并没有真正理解(因为我没有看到任何地方对其进行解释)。我看到的所有示例都不是这样做的,而是为每个事物/人创建新实例,但它们都是预定义的,而不是即时创建的。我会非常感激有人向我解释这个概念。

2个回答

3
您的例子正是它的工作方式。

1

是的,通常这就是你所做的——创建对象数组。或者根据你的语言和/或框架使用其他类型的集合。在创建新对象时,首先将其创建在临时变量中,然后将其插入到你的集合中。

有时,当你有很多对象时,你不会一次性从持久化存储(如数据库或文件)中加载所有对象。你只加载需要处理的一个(或几个)。如果只加载一个,它可能会得到一个特殊的变量。如果加载多个,则再次得到一个集合。


有没有办法让输入的数据成为实例的名称?或者这完全不必要?甚至可能吗?我在想像这样的东西...firstName = raw_input("What is your first name?: ") lastName = raw_input("What is your last name?: ") eval(firstName) = Contact(firstName, lastName) - johnharris85
1
@JHarris - 这取决于编程语言。PHP 和 Javascript 可以做到这一点。C++/C# 无法做到。然而,我认为这不是正确的思考方式。如果您想通过姓名查找联系人,请使用“字典”(某些语言中的“映射”)类型的集合。像这样为每个联系人污染命名空间将是浪费的,甚至是非常危险的(如果有人创建了一个与您的变量之一相同的名字的联系人,会怎么样?) - Vilx-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接