类函数中实例的调用列表

2024-04-28 15:14:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用“努力学习Python”来学习Python。编程对我来说是很新的。我在练习42。我被要求做以下工作:

Make some new relationships that are lists and dictionaries so you can also have "has-many" relationships.

我要程序打印弗兰克所有宠物的名字。但是,我得到一个错误,说'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

把它换成同样的错误。我很困惑,我做错什么了?你知道吗


Tags: franknameself程序宠物returnobjectdef
3条回答

问题是frank.petPetslist。要做你想做的事,你必须重新定义petsyay来处理宠物列表,并返回一个名字列表

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

如果您想同时处理两个宠物列表或一个宠物列表,您可以处理异常

def petsyay(self):
    try:
        return self.pet.callpet()
    except AtributeError: #Just handle the AttributeError to prevent hiding another exception
        return [p.callpet() for p in self.pet]

编辑后不正确(请注意,他的返回有时是一个宠物名,有时是一个宠物名列表,这是不好的):[如果你只为一个宠物调用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()

我调试了你的程序,结果是你的person对象中没有setPets方法,所以self.pets从来没有设置过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()

相关问题 更多 >