我正在使用"学习Python艰难的方式学习Python"。编程对我来说很新鲜。我正在练习42.我要求做以下事情:
建立一些列表和词典的新关系,这样你就可以拥有" has-many"关系。
我希望程序能够打印出弗兰克所有宠物的名字。但是,我收到错误'AttributeError: 'list' object has no attribute 'callpet'
。
我理解问题是我使用的是列表。当我写frank.pet = satan
时,根本没有问题。但我希望弗兰克有一只以上的宠物,我希望这个程序可以打印这些宠物的名字。
这是我正在使用的完整代码:
class Person(object):
def __init__(self, name):
self.name = name
self.pet = None
def callme(self):
return self.name
def petsyay(self):
namepet = self.pet.callpet()
return namepet
class Pets(object):
def __init__(self, petname):
self.petname = petname
def callpet(self):
return self.petname
frank = Person("Frank")
poekie = Pets("Poekie")
satan = Pets("Satan")
frank.pet = [poekie, satan]
print frank.petsyay()
我的理解是我需要拆分列表或其他东西。所以我尝试了以下方法:
def callpet(self):
for eachpet in petname:
return self.petname
这就是得到同样的错误。我很困惑,我在这里做错了什么?
答案 0 :(得分:1)
我调试了你的程序,发生的事情是你的person对象中没有setPets方法所以self.pets
永远不会被宠物列表设置。它一直是None
。我添加了一个setPets方法,并更新了petsYay
方法以返回一个列表。您还可以使用yield
并返回一个生成器来循环遍历类。下面是更新后的代码:
class Person(object):
def __init__(self, name):
self.name = name
self.pets = None
def setPets(self, p):
self.pets = p
def callme(self):
return self.name
def petsyay(self):
tempL = []
if self.pets is not None:
for pet in self.pets:
tempL.append(pet.callpet())
return tempL
class Pets(object):
def __init__(self, petname):
self.petname = petname
def callpet(self):
return self.petname
frank = Person("Frank")
poekie = Pets("Poekie")
satan = Pets("Satan")
frank.setPets([poekie, satan])
print frank.petsyay()
答案 1 :(得分:1)
编辑后不正确(注意他的回报有时候是一个宠物名,有时是一个宠物名单,但这并不好):[如果你只给E先生打一个单身宠物的答案,你就会可能会收到错误TypeError: 'Pets' object is not iterable
。只有self.pets
是一个列表,他的回答才有效,但当他们不回复时,他的回答就会失败。]
如果您想同时支持单个和多个宠物,请务必确保self.pet
为list
或确保在处理之前进行检查。 Kepp记住,你有一个恒定类型的输出退出你的功能是很重要的,否则它会让其他人的生活变得艰难。
我建议您在self.pets
__init__
作为强制性列表
class Person(object):
def __init__(self, name):
self.name = name
self.pet = None
def callme(self):
return self.name
def petsyay(self):
if isinstance(self.pet, list):
namepet = []
for pet in self.pet:
namepet.append(pet.callpet())
elif isinstance(self.pet, Pets):
namepet = []
namepet.append(self.pet.callpet())
else:
raise ValueError("Not a correct type. Send Pets or list of Pets")
return namepet
class Pets(object):
def __init__(self, petname):
self.petname = petname
def callpet(self):
return self.petname
frank = Person("Frank")
poekie = Pets("Poekie")
satan = Pets("Satan")
frank.pet = [poekie, satan]
print frank.petsyay()
frank.pet = poekie
frank.petsyay()
print frank.petsyay()
答案 2 :(得分:0)
问题是frank.pet
是list
的{{1}}。要做你想做的事,你必须重新定义Pets
以使用宠物列表,并返回一个名单
petsyay
如果你想同时使用宠物或单只宠物的名单,你可以处理例外
def petsyay(self):
return [p.callpet() for p in self.pet]