Python类:如何处理“未来”实例

2024-05-19 17:02:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在自学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\u contact(),使我创建一个新联系人并将其存储在list/dict中?我怎么称呼它?我不知道如何创建一个新实例,而不必硬编码它的名称,如“contact1”等。如何使带有“contact1”和“contact2”的行成为一个动态的东西?你知道吗

我试着用一个列表作为类变量来解决这个问题。类似于(假设“contact\u 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()的一个实例确实会被创建,并带有这些属性。。。但它没有名字。如何访问它?(我怎么知道它的存在?有没有办法列出与某个类相关的所有现有实例?)你知道吗

我希望我说得有道理。事先谢谢你的帮助。你知道吗


Tags: 实例方法nameself编码contact联系人phone
2条回答

第一季度: 可以创建另一个用作数据库的类

class Contact(object):    
    def __init__(self, name, surname, phone):
        self.name = name
        self.surname = surname
        self.phone = phone

class ContactDatabase:
    def __init__(self, *args):
        self.inner_list = list(args)

    def add_contact(self, new_contact):
        self.inner_list.append(new_contact)


# Initial contacts
contact1 = Contact('Mark', 'Doe', '123456789')
contact2 = Contact('Sally', 'Preston', '456789123')

# Creating a database
my_database = ContactDatabase(contact1, contact2)

# Adding new contacts later
my_database.add_contact(Contact('Jim', 'Miller', '111223123'))

将“无名”实例存储在集合中并没有什么错,但我同意,一开始很难理解。;)您不需要知道要创建多少联系人,因为Python集合类型都是动态的,所以不需要预先指定大小,它们会增长以容纳您提供给它们的数据。你知道吗

下面是一个演示,它使用Contact类在列表字典中创建一个简单的电话簿。我们将每个联系人都保存在名字和姓氏下,这样我们就可以按任何一个名字查找联系人。字典的值是列表,因此我们可以处理多个同名的人。你知道吗

我向Contact添加了一个__repr__方法,以便于显示Contact实例的内容。你知道吗

from collections import defaultdict

class Contact(object):
    def __init__(self, name, surname, phone):
        self.name = name
        self.surname = surname
        self.phone = phone

    def __repr__(self):
        return '{name} {surname}: {phone}'.format(**self.__dict__)

phonebook = defaultdict(list)

data = [
    ('Mark', 'Doe', '123456789'),
    ('Sally', 'Preston', '456789123'),
    ('John', 'Doe', '789123456'),
]

for name, surname, phone in data:
    contact = Contact(name, surname, phone)
    phonebook[name].append(contact)
    phonebook[surname].append(contact)

for key, val in phonebook.items():
    print(key, val)

输出

Mark [Mark Doe: 123456789]
Doe [Mark Doe: 123456789, John Doe: 789123456]
Sally [Sally Preston: 456789123]
Preston [Sally Preston: 456789123]
John [John Doe: 789123456]

另一个选项是使phonebook成为Contact的类属性。你知道吗


当然,要使这个程序真正有用,我们需要能够将电话簿保存到磁盘,并将其重新加载。有多种方法可以做到这一点,例如将数据保存到CSV或JSON文件或^{}文件中。但这些是另一个问题的主题。;)

相关问题 更多 >