2011-04-20 31 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)