2013-12-14 144 views
0

我有兩個類,我需要能夠彼此交談,主要是從另一個類獲取數據。我省略了一切不需要的東西。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'

那麼,如何去使用的getName功能從我的住所類內部狗類?

+1

你或者想要在避難所的'__init__'中的'shelter'中放置一個'dog',或者製作一個'put'方法將其放在那裏。 – roippi

回答

1

您沒有指定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) 
+0

NVM我認爲這工作! – bob

+0

複製錯誤?這意味着你沒有複製它..複製實際的代碼,否則我幫不了你.. – aIKid

0

你的方法還真不是OOP。 shelter是什麼意思?您可以直接在doggy實例上調用getOwner。想想你正在處理的物體的物理現實。您有dogshelter。庇護所如何與狗互動?

最簡單的方法是把一個放在那裏。所以寫這個方法。讓我們給你的庇護一個resident屬性:

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

現在,最好讓你的shelter總是有一個屬性定義,所以讓我們做的是,在初始化:

def __init__(self): 
    self.resident = None 

雖然我們在它讓我們給自己指定當時我們創建住房時的居民的能力:

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

這是利用「default attrib ute「的python特性。您可以指定該參數,或不指定;如果你不這樣做,它默認爲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!' 

其他評論:你的類應該被命名開始用大寫字母,你的方法應該有利於,而不是使用混合詞下劃線分隔單詞。所以該類爲Shelter,而get_name爲該方法。這是根據Python命名約定,請參閱PEP 8瞭解所有血腥細節。 :)

+0

這是一個任務哈哈。感謝所有這些信息,當教授沒有指定時,我一定會使用它 – bob