关于python:由多个类组成的程序

Program consisting of multiple classes

我需要创建一个由两个类组成的程序:一个"人"类和一个"朋友"类。Person类必须具有属性(名字、姓氏、电话号码)。"朋友"课程必须有出生日期和电子邮件。应用程序将向用户显示一个主菜单,允许用户添加联系人、按姓名查找联系人或退出应用程序。我在这里找到了一个很好的向导我不知道如何用多个类来完成这一点。我正在上5周的课程,课本没用。如果有人能带我走过这条路,我会感激的!以下是我现在拥有的:

1
2
3
4
5
6
7
8
9
class person:
    def information:
        first = print(input("first:")
        last = print(input("last:")
        number = print(input("phone number:")
 class friend:
     def friendinfo:
         email = print(input("email:")
         birthday = print(input("birthday:")

当用户选择添加联系人时,应用程序将询问用户是否要添加普通人或朋友。如果用户想要添加一个新的常规联系人,那么应用程序将询问该联系人的名字、姓氏、姓名和电话号码。如果用户希望添加新的朋友联系人,则应用程序将向用户询问名字、姓氏、电话号码、电子邮件地址和出生日期。当用户选择按姓名查找联系人时,应用程序将向用户询问姓氏,然后应用程序将显示具有该姓氏的所有联系人的完整信息。


课堂笔记

类就像是事物的蓝图。当您创建一个类时,您只是在绘制一个蓝图,就像为一个建筑绘制建筑平面图。然而,这座建筑尚未建成。你也可以采取这些计划,创造成吨的建筑,所有都是以同样的方式形成的(我住在南加州,这是一个非常面向面向OOP的地方,如郊区所示)。无论如何,类只是一个模板。当您实际使类定义的东西,然后您可以用数据填充它。

问题第一部分

让我们看看你需要什么:

The person class must have the attributes( first_name, last_name,
phone_number ). The"friend" class must have birth date and email.

那么让我们做一个叫做人的类:

1
class Person:

当我们创建类时,我们"实例化"它们,并且我们经常需要一些指令,这样当创建/实例化其中一个"人"时,程序就知道要做什么。我们经常把这些指令放在一个名为"init"的部分中:

1
2
class Person:
    def __init__(self):

"self"部分令人困惑,但我们类中的每个方法都需要某种方式来知道它是特定类对象的一部分。这是一种非常模糊的方式来掩盖"自我"的情况。现在,这只是一个一般规则:我们在类中放入的所有函数都将以"self"作为第一个参数。

接下来,我们要添加您提到的属性。通常是这样的:

1
2
3
4
5
6
class Person:

    def __init__(self, first_name, last_name, phone_number):
        self.first_name = first_name
        self.last_name = last_name
        self.phone_number = phone_number

我把这些属性放在__init__函数中,这意味着每当我第一次创建这些"人"的东西时,我必须指定这些东西,否则我的创建将无法工作。当我创建一个类时,我只需要调用我的类Person,并给出它期望的东西:

1
bob = Person('Bob', 'Something', '43819110')

现在我可以通过以下方式访问Bob的属性:

1
2
>>> bob.phone_number
'43819110'

我们可以添加一个新的人(可能使用input(),正如上面所述…):

1
sinatra = Person('Frank', 'Sinatra', 217653918')

我们做得很好,用我们的Person蓝图创造了各种各样的人。我们需要一些容器来容纳所有这些人:

1
contacts = [sinatra, bob, etc.]

我们可以通过迭代该容器来获取某人的电话号码:

1
2
3
for contact in contacts:
    if contact.first_name == 'Bob':
      print(contact.phone_number)

这里有很多工作要做,但它可能会帮助你朝着正确的方向开始。重点是将任务分开,并努力让它们协同工作。编码愉快!

[删除了所有其他内容,因为它太长,无法真正对其他人有用]


这可能不符合您的结构要求,但如果我要做您正在做的事情,我可能会尝试更像这样的结构:

1
2
3
4
5
6
7
8
9
10
11
12
class contacts:
    contacts = [{...}, {...}] # Contains all the contacts as dictionaries in a list

    def add_person(...):
        self.all_contacts += ...

    def add_friend(...):
        self.all_contacts += ...

    def get_contact(...):      # This is just potential code
        if ... in self.all_contacts:
            return ...

(如果我真的想让朋友和人分开的话:)

1
2
3
people = [{...}, {...}]            # all people contacts
friends = [{...}, {...}]           # all friend contacts
all_contacts = people + friends    # both

我更喜欢这个方法,因为(我认为)它的层次结构比为两个相似的东西分别创建类要清晰。(即朋友和人)

这种方式使不同的"联系簿"更容易理解为contacts类的多个实例,每个实例中都有朋友和人类别。

1
2
3
4
jims_contacts = contacts()
jims_contacts.add_friend("Megan","Cook", 02754321,"[email protected]", 170398)

more_contacts = contacts()

P.S.一个联系人就像一本字典:

1
{'first':"Zaphod", 'last':"Beeblebrox", 'number':2293107}

…每个联系人都存储在一个列表中。这使得很容易提取属性并在以后查找内容。

祝你好运!


嗯,我不能给你所有的答案,因为这似乎是你的家庭作业,但我会帮助你开始。这是您所描述的个人类的最低要求(可能是您所需要的全部要求):

1
2
3
4
5
6
class Person(object):

    def __init__(self, first, last, phone):
        self.first_name = first
        self.last_name = last
        self.phone_number = phone

我猜你的课程老师希望你使用继承。如果他真的…好吧,即使他没有,为朋友使用继承也是一个好主意(即,friend类应该是派生的person类)。

有关继承的更多信息,请查看此线程:

在python中使用super()关键字进行单一继承的基本示例是什么?

如果您有任何问题,请随时发表评论。