Python - 何时创建类以及何时创建函数

时间:2014-05-23 14:12:09

标签: python function class oop

是的,所以我正在尝试使用Python OOP创建一个Contacts应用程序。我是OOP的新手,仍然试图理解这些概念。

我知道Class是所有对象的蓝图。我喜欢将Class视为一个实体,每个Object都是该实体的记录。我来自数据库背景,这就是为什么我这样解释它,随时纠正我。

无论如何,在我正在制作的联系人应用中,我创建了类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”的表,因为你会通过查询来实现或者存储过程,所以在我看来我会定义添加联系人是一个功能。但是问我做C#编程的同事他说添加联系人应该由一个类来定义。

对我来说这是一个令人困惑的概念,特别是因为我不明白如何将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"))

请帮帮我,因为我将把它变成一个GUI应用程序(单一分配)。

2 个答案:

答案 0 :(得分:6)

添加联系人正在做某事,而不是做某事,所以它作为方法/功能而不是类是有意义的。我建议你的功能实际上应该放在两个不同的地方。

从用户输入创建新联系人应该是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个实例。
  3. 例如:

    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()

答案 1 :(得分:2)

首先,您的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的任何部分。