作业:Python 3.3:通过属性调用类实例

Posted

技术标签:

【中文标题】作业:Python 3.3:通过属性调用类实例【英文标题】:Assignment: Python 3.3: calling a class instance through an attribute 【发布时间】:2013-04-22 14:58:23 【问题描述】:

我的代码的“get_info”部分遇到了一些问题。具体来说,只要我输入 self 部分并且它对应于类中的实例,我的 get_info 就可以工作,即

x=Person('Joe', 'Schmoe', '123-456-7890')
x.get_info()

但是,我不知道如何通过搜索姓氏来显示联系人的信息。据我所知,类是不可迭代的,所以我不能使用 for 循环。显然,我的代码底部有问题,以“elif x==2:”开头,这是我的代码:

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
        print("Initialized Person: ", self.first_name)
    def get_info(self):
        print(self.first_name, self.last_name, self.phone_number)

class Friend(Person):
    def __init__(self, first_name, last_name, phone_number, email, birth_date):
        Person.__init__(self, first_name, last_name, phone_number)
        self.email = email
        self.birth_date = birth_date
        print("Initialized Friend:", self.first_name)
    def get_info(self):
        print(self.first_name, self.last_name, self.phone_number, self.email, self.birth_date)

def main():
    exitprogram=False
    a=("1. Add Contact")
    b=("2. Lookup Contact")
    c=("3. Exit Program")
    while exitprogram==False:
        print(a)
        print(b)
        print(c)
        x=(int(input("Please select a number: ")))
        if x==1:
            a1=("1. Add Regular Person")
            a2=("2. Add Friend")
            print(a1)
            print(a2)
            y=(int(input("Please select a number: ")))
            if y==1:
                f=(input("Please enter the first name: "))
                l=(input("Please enter the last name: "))
                p=(input("Please enter the phone number: "))
                new=Person(f, l, p)
            elif y==2:
                f=(input("Please enter the first name: "))
                l=(input("Please enter the last name: "))
                p=(input("Please enter the phone number: "))
                e=(input("Please enter the email address: "))
                b=(input("Please enter the birth date in m/d/year format: "))
                new=Friend(f, l, p, e, b)
        elif x==2:
            w=(input("Please enter the last name of the contact you wish to view: "))
            w=Person.get_info(w)
        elif x==3:
            exitprogram=True
main()

【问题讨论】:

当您创建一个 Person 或 Friend 对象时,您将它分配给一个名为 new 的变量,但是您如何处理该变量呢?您不会将它存储在任何地方,因此下次创建新的 Person 或 Friend 对象时,旧的对象会被覆盖。尝试制作一个列表,并使用my_list.append() 来存储您的对象——然后您将能够遍历您的列表。 就像大家说的那样。列表可能是最好的。如果您对某些可以完全按照您在 'elif x==2' 上尝试的东西感兴趣,那么就会有一些东西。您可以查找元类。通过一些工作,从 Person 类继承的类可以在所有 Person 中进行搜索。您可能仍然需要一个列表或字典。它们不是最简单的东西,也不是在所有情况下都是最好的,但元类有时会很有用。 【参考方案1】:

您需要将联系人存储在列表中。例如:

contacts = []
# To add a contact:
contacts.append(Person(...))

如果你这样做,当然,你可以像任何其他列表一样循环遍历它:

for person in contacts:
    if person.last_name == requested_last_name:
        person.get_info()

【讨论】:

成功了!非常感谢。我现在意识到将每个联系人添加到列表然后遍历列表要容易得多。【参考方案2】:

如果您使它们可迭代,则类是可迭代的,但这对您没有帮助。您需要保留一份人员名单:

people = []

当你创建一个新人时,将他们添加到列表中:

person = Person(firstname, lastname, phone)
people.append(person)

现在,您可以搜索人员列表:

def search(people, lastname):
    for person in people:
        if person.lastname == lastname:
            return person

    return False

【讨论】:

以上是关于作业:Python 3.3:通过属性调用类实例的主要内容,如果未能解决你的问题,请参考以下文章

Python ❀ 类

Python ❀ 类

课后作业2

Python之路,Day7 - 面向对象编程进阶

python学习之创建和使用类

JAVA作业 04 类与对象