【发布时间】:2018-04-29 14:48:49
【问题描述】:
我正在自学 Python(2.7,之前没有编码经验),而且我刚刚开始处理类和 OOP 概念。作为练习,我正在尝试编写一个非常简单的地址簿。我想我设法理解了类和实例的基础知识,但我发现目前难以掌握的是如何进一步发展抽象级别。
试图更好地解释,比如说我有这个,这通常是许多教程用来介绍类的基本示例:
class Contact(object):
def __init__(self, name, surname, phone):
self.name = name
self.surname = surname
self.phone = phone
contact1 = Contact('Mark', 'Doe', '123456789')
contact2 = Contact('Sally', 'Preston', '456789123')
到目前为止一切顺利,我可以使用contact1.attribute 或其他方法做很多其他有趣的事情。这里没问题。
我无法理解的内容如下:
问题 1:
我不知道我会有多少联系人。如果我不知道我将拥有多少个联系人,我该如何创建一个方法,比如 create_contact(),让我创建一个新联系人并将其存储在列表/字典中?我怎么称呼它? 我不明白如何制作它,这样我就可以创建一个新实例而无需硬编码其名称,如“contact1”等。我如何使“contact1”和“contact2”一行动态的东西?
我尝试使用列表作为类变量来解决问题。类似的东西(假设“contact_list”已经作为类变量存在):
Contact.contact_list.append(Contact('Mark', 'Doe','123456789')) # obviously I'd use raw_input instead of 'Mark' etc, but I avoided it here for readability
但我最终得到了一个无名对象列表,我的大脑很难处理它。我可以使用列表索引访问它们,但我不确定我是否在正确的轨道上......任何帮助将不胜感激。
问题 2:(有点相关,以便更好地理解问题)
如果在 python CLI 中我放了类似的东西(假设前面定义类的块已经运行):
>>> Contact('Bob', 'Stevens', '32165497')
我的理解是确实创建了一个具有这些属性的 Contact() 实例......但它没有名称。我如何访问它? (我怎么知道它存在?有没有办法列出与某个类相关的所有现有实例?)
我希望我说得有道理。提前感谢您的任何帮助。
【问题讨论】:
-
在 SO 上,最好每个问题坚持一个问题。但至于您的第二个问题,当您这样做
Contact('Bob', 'Stevens', '32165497')时,会创建一个实例,但由于您没有分配它或将其保存在列表等中,它会被丢弃,因此您无法访问它。 -
顺便说一句,您应该认真考虑学习 Python 3,Python 2 将在 2020 年正式结束生命周期。Python 3 有许多改进,尤其是在您使用类。
-
我开始使用 Python 2 只是因为我尝试的第一本书是旧版本的“Learn Python the Hard Way”。在他开始谈论 OOP 之后,我立即放弃了它。他假设太多,或者我对那本书不够聪明……不管怎样,现在我有点靠自己了,我已经在考虑切换到 Python 3,越早越好……对现在我知道的太少了,唯一的区别似乎是 print() 函数:D(当然不是,但我现在不知道更好)
-
FWIW,SO Python 聊天室常客do not recommend LPTHW;这本书有几个问题。 FWIW,您可以在任何其他导入之前将
from __future__ import print_function, division放在脚本顶部,从而获得 Python 3print和 Python 2.6+ 中的除法行为。但是使用实际的 Python 3 解释器要好得多。而且越早切换越好。这样,您就不必忘记 Python 3 已纠正的 Python 2 的各种“不幸”特性。 -
这里是 Python 3 学习资源的简短列表:sopython.com/wiki/What_tutorial_should_I_read%3F