【问题标题】:Object Oriented Python面向对象的 Python
【发布时间】:2024-10-11 21:50:01
【问题描述】:

因此,为了练习 Python 并更具体地了解面向对象编程,我编写了这个简单的脚本来更好地理解这些概念。但是,当我尝试启动“猴子”对象时,最终发生的事情是 Python 无限期地添加了我的第一个猴子对象的名称……我接近 OOP 对吗?如果是这样,我哪里错了,因为我不知道...... 谢谢

#! 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

【问题讨论】:

  • 我找不到错误。您能否显示完整的代码,包括您的输出?
  • 这似乎对我有用?我正在做 m=monkeys(monkeylist);print type(m) ,它正确返回“type 'instance'”。正如 Achim 所说,您能否发布其余代码并显示输出。
  • 未来的两个小注意事项:(1)类名应该在CamelCase(即MonkeyMonkeys)和变量/成员/函数/方法名应该是lowercase_with_underscores为了公约。 (2) 类应该从 Python 2.x 中的object (class Monkey(object)) 派生,因为“旧式类”只是简单而令人头疼的问题。
  • 您似乎在初始化中添加了monkeylist.append(self.name)。它的缩进错误。仅用于块级别的缩进。如果您在 Monkeys 类中遍历它以在 Monkey 类恕我直言中更改它,这也可能不是最好的主意。

标签: python oop function


【解决方案1】:

您的代码可以做一些清理工作。猴子类是多余的,因为它只是体现了它包含的字典。你可以这么写:

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

OOP 本身并不是目的。当它简化事情时使用它。在这种情况下,对猴子集合使用 OOP 为 bug 的蔓延创造了空间(这就是为什么我认为我会将其发布为答案而不是评论)。

【讨论】:

  • monkey(name) 不是monkey{name: monkey(name) for name in monkeylist} 也是 Py2.7+ 的一个不错的特性。
  • @katrielalex:感谢您的更正。此外,我更喜欢坚持使用 2.6 语法,至少要坚持一段时间。
  • 好吧,如果我看到“monkeylist”的内容,我发现它已经添加了数千次这个名字......另外,如果我想的话,我不需要再上一堂课了吗?对多个“猴子”执行方法?
  • @Pete:我意识到出了什么问题并改变了我的答案(可能在你写上述评论的时候)。很抱歉造成混乱。
  • 哦,好的,我明白了。我只是想创建一些可以使用 OOP 的琐碎案例。但是,尽管如此,要点。
【解决方案2】:

你可能想要代替:

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) 

【讨论】:

    【解决方案3】:

    假设您使用名称列表初始化 Monkeys,而不是

    self.allmonkeys[name] = monkey(name)
    

    我想你想要

    self.monkeydict[name] = monkey(name)
    

    仅供参考,Python 命名约定是将类大写。另外我不认为Monkeys 是一个描述性的名称; Zoo 可能会更好。另请注意,monkeylist 是名称列表(即不是 Monkeys 的列表)的混淆名称。

    【讨论】:

    • 感谢您的提示,您的解决方案有效。我正在努力理解这些概念,感谢您的帮助。
    最近更新 更多