Python-从其他类中检索数据

2024-04-19 11:24:03 发布

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

我有两个类,我需要能够互相交谈,主要是一个从另一个数据。我省略了所有不需要的东西。你知道吗

class dog(object):
    def __init__(self,name):
        self.name = name
    def getOwner(self):
        return self.name

class shelter(object):
    def getName(self,dogName):
        return dogName.getName()

doggy = dog("Rover")
animalHouse = shelter()

print animalHouse.getName("rover")

唯一返回的是AttributeError: 'shelter' object has no attribute 'getName'

那么,如何在我的庇护所类中使用dog类的getName函数呢?你知道吗


Tags: 数据nameselfreturnobjectinitdefclass
2条回答

你的方法真的不是面向对象的。shelter的意义是什么?您可以直接在doggy实例上调用getOwner。想想你正在处理的物体的物理现实。你有一个dog和一个shelter。收容所如何与狗互动?你知道吗

最简单的方法就是放一个进去。所以写下这个方法。让我们给你的庇护所一个resident属性:

def put(self,dog):
   self.resident = dog

现在,最好让shelter始终定义该属性,所以让我们在初始值设定项中这样做:

def __init__(self):
    self.resident = None

当我们在这里的时候,让我们给自己一个能力,在我们创建庇护所的时候,指定一个居住者:

def __init__(self,dog=None):
    self.resident = dog

这是在利用python的“default属性”特性。您可以指定该参数,也可以不指定;如果不指定,则默认为None。如果这很混乱,可以跳过此步骤。你知道吗


考虑到所有这些(并且有put一个dog),现在我们有一个shelter包含Nonedog。现在让我们编写getName方法。你知道吗

def getName(self):
    if self.resident:
        return self.resident.getOwner() #this method is questionably named, but you wrote it
    else:
        return 'nobody home!'

其他注释:你的类应该以大写字母开始命名,你的方法应该使用下划线来分隔单词,而不是使用mixedCase。所以类的Shelter,方法的get_name。这是根据python命名约定的,请参见pep8了解所有血腥的细节。:)

您没有指定getName函数。我认为您希望在dog类中声明getName,而不是getOwner,并且需要将dog的实例传递给函数。你知道吗

class dog(object):
    def __init__(self,name):
        self.name = name
    def getOwner(self):
        return self.name

class shelter(object):
    def getName(self,dogName):
        return dogName.getOwner()

doggy = dog("Rover")
animalHouse = shelter()

最后:

#Pass the instance!
print animalHouse.getName(doggy)

相关问题 更多 >