在Python中从类调用列表



如果从类中调用列表,输出的不是列表的内容。

我想调用self。从Owner类中取出宠物,但输出的不是列表的内容,而是:

David Friend's pets are: [<__main__.Pet object at 0x7f547c620128>, <__main__.Pet object at 0x7f547c620198>]
Audrey Hepburn's pets are: [<__main__.Pet object at 0x7f547c620208>]
I expected my code to print this:
David Friend's pets are: Boggle Joyner, Artemis Joyner
Audrey Hepburn's pets are: Pippin Hepburn

代码如下:

class Name:
def __init__(self, first, last):
self.first = first
self.last = last
class Pet:
def __init__(self, name, owner):
self.name = name
self.owner = owner

class Owner:
def __init__(self, name):
self.name = name
self.pets = []
def get_pets_string(an_owner):
return str(an_owner.name.first) + " " + str(an_owner.name.last) + "'s pets are: " + str(an_owner.pets)

owner_1 = Owner(Name("David", "Friend"))
owner_2 = Owner(Name("Audrey", "Hepburn"))
pet_1 = Pet(Name("Boggle", "Joyner"), owner_1)
pet_2 = Pet(Name("Artemis", "Joyner"), owner_1)
pet_3 = Pet(Name("Pippin", "Hepburn"), owner_2)
owner_1.pets.append(pet_1)
owner_1.pets.append(pet_2)
owner_2.pets.append(pet_3)
print(owner_2.name.first)
print(get_pets_string(owner_1))
print(get_pets_string(owner_2))

这是因为您将宠物对象存储在列表中,因此它将打印出该对象。你应该重写字符串函数来解决这个问题,像这样:

class Pet:
def __init__(self, name, owner):
self.name = name
self.owner = owner
def __str__(self):
return self.name

名称类应该像这样:

class Name:
def __init__(self, first, last):
self.first = first
self.last = last
def __str__(self):
return self.first + " " + self.last

get pets函数应该是这样的:

def get_pets_string(an_owner):
res = str(an_owner.name.first) + " " + str(an_owner.name.last) + "'s pets are: "
for pet in an_owner.pets:
res += str(pet) + ", "
return res

这是如果你想保持它像你创建它,然而有更简单的方法来编写这段代码,如:

class Owner:
def __init__(self, name: str):
self.name = name
self.pets = []
def add_pet(self, pet: str):
self.pets.append(pet)
def get_pets(self):
res = self.name + "'s pets are: "
for pet in self.pets:
res += pet + ", "
return res
o = Owner("David Friend")
o.add_pet("Boggle Joyner")
o.add_pet("Artemis Joyner")
print(o.get_pets())

最新更新