Объектно-ориентированный Python - PullRequest
3 голосов
/ 21 апреля 2011

Итак, в интересах практики Python и более точного понимания объектно-ориентированного программирования, я написал этот простой скрипт, чтобы лучше понять концепции. Однако, когда я пытаюсь инициировать объект "обезьяны", в конечном итоге 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

Ответы [ 3 ]

3 голосов
/ 21 апреля 2011

Предполагая, что вы инициализируете Monkeys списком имен вместо

self.allmonkeys[name] = monkey(name)

Я думаю, что вы хотите

self.monkeydict[name] = monkey(name)

FYI Соглашение об именах Python таковоклассы должны быть прописными.Также я не думаю, что Monkeys является описательным именем;Zoo может быть лучше.Также обратите внимание, что monkeylist является запутанным именем для списка имен (то есть не для списка Monkey s).

1 голос
/ 21 апреля 2011

Ваш код может быть немного очищен. Класс обезьян избыточен, так как он просто воплощает в себе диктат, который он содержит. Вы могли бы просто написать это:

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

ООП не является самоцелью. Используйте это, когда это упрощает вещи. В этом случае использование ООП для коллекции обезьян создало пространство для появления ошибки (именно поэтому я решил опубликовать это как ответ, а не как комментарий).

0 голосов
/ 21 апреля 2011

Вы, вероятно, хотите вместо:

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) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...