Python - 何时创建类,何时创建函数

8

好的,我将尝试使用Python OOP创建一个联系人应用程序。我对OOP相当新,并且仍在努力理解相关概念。

我知道类是所有对象的蓝图。我喜欢把类看作实体,每个对象都是该实体的记录。由于我的背景是数据库,所以我会这样理解,如果有不对的地方,请指出。

在我的联系人应用程序中,我创建了以下类Contacts

 class Contacts():
    def __init__(self, firstName, lastName, address, groupType,
                 telephone, mobile, email, photoField):
        self.firstName = firstName
        self.lastName = lastName
        self.address = address
        self.groupType = groupType
        self.telephone = telephone
        self.mobile = mobile
        self.email = email
        self.photoField = photoField

    def showDetails(self):
        print("First Name:\t", self.firstName)
        print("Last Name:\t", self.lastName)
        print("Address:\t", self.address)
        print("Telephone:\t", self.telephone)
        print("Mobile:\t", self.mobile)
        print("Email:\t", self.email)

现在,如果我想通过Contacts类向我正在使用的列表中添加联系人对象,我是需要创建一个AddContacts类还是创建一个函数呢?我不知道我是否能够清楚地表达我的意思?
我想说的是,添加联系人是一个过程,如果你从数据库的角度来看,你不会创建一个名为“tbl_AddContacts”的表,因为你可以通过查询或存储过程来完成这个任务,所以在我的观点中,我会把添加联系人定义为一个函数。但是我的同事告诉我,添加联系人应该由一个类来定义。
对我来说,这是一个令人困惑的概念,特别是我不知道如何将AddContacts类与Contacts类链接起来,甚至不知道如何首先定义AddContacts类!
以下是我为添加联系人定义的函数:
def addContacts():
    firstName = input("First Name: ")
    lastName = input("Last Name: ")
    address = input("Address: ")
    telephone = input("Telephone: ")
    mobile = input("Mobile: ")
    email = input("Email: ")
    print("\n")

    contact = Contacts(firstName, lastName, address, None, telephone, mobile, email, None)

    contactsList.append(contact)

    pickle.dump(contactsList, open("save.p", "wb"))

请帮我一下,因为我将把它转化为图形用户界面应用程序(大学作业)。
2个回答

9

添加联系人是一种行为,而不是一种状态,因此将其作为方法/函数而不是类会更有意义。我建议您的功能实际上应该分别放在两个不同的位置。

从用户输入创建新联系人应该是Contact的一个类方法

class Contact(object):

    ...

    @classmethod
    def from_input(cls):
        firstName = input("First Name: ")
        lastName = input("Last Name: ")
        address = input("Address: ")
        telephone = input("Telephone: ")
        mobile = input("Mobile: ")
        email = input("Email: ")
        return cls(firstName, lastName, address, None, 
                   telephone, mobile, email, None)

向联系人列表添加新联系人应该是以下两种方式之一:

  1. 作为 实例方法,添加到例如 AddressBookContactList 类(或其他保存联系人列表的类)中;或者
  2. 如果没有类来保存 Contact 实例,则作为单独的 函数

例如:

class AddressBook(object):

    ...

    def add_contact(self, contact=None):
        if contact is None:
            contact = Contact.from_input()
        self.contacts.append(contact)

现在您的用户界面可以创建一个Contact对象并直接传递给address_book.add_contact()方法。

感谢您的帮助。我正在努力通过“add_contact”结构传递我的联系人对象,但最终我会解决的。 - RoyalSwish

3

首先,你的Contacts类更适合称为Contact,因为它只代表一个单一的联系人。你的addContacts选项可以是一个独立的函数,或者你可以将其作为ContactList类的一部分,该类管理你的Contact对象列表。

class ContactList():
    def __int__(self):
        self.contact_list = []

    def addContact(firstName, lastName, address, telephone, mobile, email):
        contact = Contact(firstName, lastName, address, None, telephone, mobile, email, None)
        self.contact_list.append(contact)
        pickle.dump(contact_list, open("save.p", "wb"))

我建议将UI交互部分(所有的input()调用)与您的函数/方法分离,因为正如您所说,最终它将成为一个GUI应用程序。您应该保持实际从用户获取输入的代码分离,以便稍后更改它而无需更改ContactContactList的任何部分。


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