2011-04-20 36 views
3

因此,爲了更好地理解概念,爲了實踐Python,更具體地理解面向對象編程,我編寫了這個簡單的腳本。然而,當我嘗試啓動一個「猴子」對象時,最終發生的事情是Python無限期地添加了我的第一個猴子對象的名字......我是否接近OOP?如果是的話,我要去哪裏錯了,因爲我不能告訴... 感謝面向對象的Python

#! usr/bin/python 
monkeylist = [] 
class monkey: 
    def __init__(self, name): 
     self.name = name 
     self.banana = [] 
       monkeylist.append(self.name) 
    def addbanana(self, kind): 
     self.banana.append(kind) 

class monkeys: 
    def __init__(self, monkeylist): 
     self.allmonkeys = monkeylist 
     self.monkeydict = {} 
     for name in self.allmonkeys: 
      self.allmonkeys[name] = monkey(name) 
    def addbanana(self, name, kind): 
     self.monkeydict[name].addbanana(kind) 

確切的輸入和輸出是這樣的......

python -i objtest.py 
>>> bob = monkey("bob") 
>>> test = monkeys(monkeylist) 
^CTraceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "objtest.py", line 15, in __init__ 
self.allmonkeys[name] = monkey(name) 
File "objtest.py", line 7, in __init__ 
monkeylist.append(self.name) 
KeyboardInterrupt 
+1

我不能發現錯誤。你能顯示完整的代碼,包括你的輸出嗎? – Achim 2011-04-20 23:01:38

+0

這似乎適用於我?我在做m =猴子(monkeylist);打印類型(m),它正確地返回「類型」實例'「。正如Achim所說,你可以發佈其餘的代碼並顯示輸出。 – monojohnny 2011-04-20 23:03:02

+2

未來的兩個小調:(1)爲了約定,類名應該在'CamelCase'(即'Monkey'和'Monkeys')和變量/成員/函數/方法名應該是'lowercase_with_underscores'。 (2)類應該從Python 2.x中的'object'('class Monkey(object)')派生,因爲「舊式類」只是令人頭痛的難題。 – delnan 2011-04-20 23:07:38

回答

3

假設你初始化一個Monkeys與名稱的列表,而不是

self.allmonkeys[name] = monkey(name) 

,我想你想

self.monkeydict[name] = monkey(name) 

僅供參考Python的命名約定是類大寫。我也不認爲Monkeys是一個描述性名稱; Zoo可能會更好。還要注意的是,monkeylist是名稱列表的混淆名稱(即不是Monkey的列表)。

+0

感謝提示,解決方案奏效。我試圖圍繞這些概念包圍我的頭,並感謝您的幫助。 – danem 2011-04-20 23:25:17

1

你的代碼可以做一些清理工作。猴類是多餘的,因爲它只是體現了它所包含的詞典。你可以簡單地寫下:

mm = dict((name, monkey(name)) for name in monkeylist) 
mm['harold'].addbanana('green') 

OOP不是自己的權利的結束。在簡化事情時使用它。在這種情況下,爲猴子集合使用OOP創造了一個空間,讓一個bug蔓延(這就是爲什麼我認爲我會發布這個答案而不是評論)。

+0

'猴子(名字)'不'猴子'。另外'{名稱:猴子(name)在monkeylist中的名稱}'是Py2.7 +的一個很好的功能。 – katrielalex 2011-04-20 23:07:37

+0

@katrielalex:感謝您的糾正。另外,我寧願堅持使用2.6語法,至少稍等一會兒。 – 2011-04-20 23:11:48

+0

那麼,如果我看到「monkeylist」的內容,我發現它已經添加了數千次的名字....另外,如果我想要在多個「猴子」上執行方法,我不需要另一個類, ? – danem 2011-04-20 23:15:42

0

你可能想代替:

for name in self.allmonkeys: 
    self.allmonkeys[name] = monkey(name) 

for name in self.allmonkeys: 
    self.monkeydict[name] = monkey(name) 

甚至:

self.monkeydict = dict((name, monkey(name)) for name in allmonkeys)