【问题标题】:Python - When to create a Class and when to create a FunctionPython - 何时创建类以及何时创建函数
【发布时间】:2014-07-12 22:44:38
【问题描述】:

好的,所以我正在尝试使用 Python OOP 创建一个联系人应用程序。我对 OOP 还很陌生,但仍在努力理解这些概念。

我了解类是所有对象的蓝图。我喜欢将 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 应用程序(uni assignment)。

【问题讨论】:

    标签: python function class oop


    【解决方案1】:

    添加联系人是在做某事,而不是成为某事,因此将其作为方法/函数而不是类是有意义的。我建议您的功能实际上应该位于两个不同的位置。

    从用户输入创建新联系人应该是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)
    

    现在您的 UI 可以创建 Contact 并将其直接传递给 address_book.add_contact()

    【讨论】:

    • 为帮助干杯。我正在努力通过add_contact 构造实际传递我的联系人对象,但我最终会弄明白的。
    【解决方案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 的任何部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2017-11-17
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多