Python 使用创建的类

Python 使用创建的类,python,Python,我已创建了该类人员: class Person(object): def __init__(self, name, age, gender): self._name = name self._age = age self._gender = gender self._friend = None def __eq__(self, person): return str(self) == str(pe

我已创建了该类人员:

class Person(object):
    def __init__(self, name, age, gender):

        self._name = name
        self._age = age
        self._gender = gender
        self._friend = None

    def __eq__(self, person):
        return str(self) == str(person)

    def __str__(self):
        if self._gender == 'M':
            title = 'Mr'
        elif self._gender == 'F':
            title = 'Miss'
        else:
            title = 'Ms'

        return title + ' ' + self._name + ' ' + str(self._age)

    def __repr__(self):
        return 'Person: ' + str(self)

    def get_name(self):
        return self._name

    def get_age(self):
        return self._age

    def get_gender(self):
        return self._gender

    def set_friend(self, friend):
        self._friend = friend

    def get_friend(self):
        return self._friend
我现在需要有3个功能:

使用Person类编写一个函数print\u friend\u infoperson,该函数接受Person类型的单个参数,并且:

打印出他们的名字 打印出他们的年龄 如果此人有任何朋友,则打印“具有{name}的朋友” 函数create_fry返回代表fry的Person实例。Fry今年25岁,全名是“Philip J.Fry”

函数的作用是将每个参数设置为另一个参数的朋友

这就是我得到的:

def print_friend_info(person):
    person= Person
    person_name=person.get_name(person)
    person_age=person.get_age(person)
    person_gender=person.get_gender(person)
    person_friends=person.get_friend(person)
    return person_name, person_age, person_gender, person_friends
    """print (person_name)
    print (person_age)
    print ('Friends with {'+person_friends+'}')"""


def create_fry():
    fry=Person("Philip J. Fry", 23, "M")
    return fry


def make_friends(person_one,person_two):
    return person_one.set_friend(person_two)

错误处理程序说类型对象“Person”没有属性“\u name”

您想删除这一行吗

person= Person
person = Person
从print\u friend\u infoperson:函数

该行不会创建一个新的Person实例,即使创建了,您也不需要这样做。您已经获得了作为参数传入的人员,您需要做的就是检索他的信息

因为类在python中是对象,所以通过person=person,您只是说person与person相同。然后,当您尝试在person上获取_名称时,这不起作用,因为person不是类的实例,而是类对象。因此它没有_name属性。只有在使用适当的参数实例化它之后,它才会有一个_name属性

它仍然无法打印所需的信息

这个代码似乎不正确。它不打印数据,而是返回数据。文本between不起任何作用,因为您已将函数保留为return

可能应该被替换为

print (person_name)
print (person_age)
print ('Friends with {'+person_friends+'}')
return  # this is not necessary, but it's better to be explicit.

如果参数person已经是一个实例,则不理解您试图在print\u friend\u info中输入的内容

我想你的问题是这条线

person= Person
person = Person
通过这样做,您只需重写person,它是一个实例,并将其替换为类person的定义

试着遥控那条线,看看会发生什么。一旦你有了一个Person对象,比如一个标签Person,你就可以像这样访问它的功能:

>>> person = Person('Pete', 43, 'Male')
>>> person.get_age()
43
您不需要将person传递给成员函数get_age:

但get_age的定义有一个参数,self:

当您在对象上调用函数时,它会隐式传递给函数。所以这个人被传为自我。您可以在上面的错误消息中看到,我们传递了两个参数,内隐的self-person和错误的、不需要的explicit-person

self.\u age与person.\u age相同,但被封装并隐藏在“getter”界面后面

因此,要修复代码,请删除:

person = Person

并将诸如person.get\u ageperson之类的调用更改为person.get\u age。

我已删除了该行,但它仍然无法打印所需的信息。如何调用该函数?这取决于你传递给那个函数的参数。这与你的问题无关,但那个Person类非常不和谐。虽然getter方法在其他语言中很常见,但不需要get_name和类似的方法。Python中更自然的设计可能只是使用普通属性或属性描述符,它们的工作方式与使用它们的代码的常规属性类似,但使用getter和/或setter函数实现。
person = Person