在类的函数中调用实例列表

时间:2015-12-30 14:31:02

标签: python python-2.x

我正在使用"学习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

这就是得到同样的错误。我很困惑,我在这里做错了什么?

3 个答案:

答案 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.petlist或确保在处理之前进行检查。 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.petlist的{​​{1}}。要做你想做的事,你必须重新定义Pets以使用宠物列表,并返回一个名单

petsyay

如果你想同时使用宠物或单只宠物的名单,你可以处理例外

def petsyay(self):
    return [p.callpet() for p in self.pet]