У меня есть два класса:
class Dog(object):
def __init__(self, name):
self.name = name
class Toy(object):
def play(self):
print "Squeak!"
Мне нужно придумать метод под названием play (self, toy, n) для класса Dog. Он печатает "Yip!" (С пробелом), за которым следует выход из play.play на той же строке. Это случается n раз, причем n выходов на отдельных линиях. Если n отрицательно, это то же самое, что и 0.
Что я сделал, это
def play(self, toy, n):
count = 1
if n > 0:
while count <= n:
print "Yip! %s " % Toy().play()
count += 1
else:
print None
Однако, когда я называю Dog ('big'). play (toy, 3) или что-то вроде n, это показывает, что Писк! Yip! Никто Писк! Yip! Никто Писк! Yip! Никто Я не знаю, что случилось. Визга! и Ип! должно быть, должно быть на той же линии, пока есть в отдельном сейчас, и там порядок должен быть противоположным. А почему нет? Кто-нибудь может помочь мне?
В вашем примере вызова Dog('big').play(0)
вы не передаете аргумент toy
- то, на что он жалуется! Передайте аргумент игрушки до n
, и это будет лучше.
Затем вы можете начать обращать внимание на ошибки в реализации play
: почему вы создаете новую игру, а не используете аргумент, почему вы печатаете 'None'
, когда это не входит в спецификации, как вы бесполезны напечатать возвращаемое значение метода Toy.play
(который неявно возвращает None
), а не работать вместе с тем фактом, что последний метод print
что-то делает и никогда не увеличивает count
и, таким образом, заканчивается в бесконечных циклах,
(четыре серьезных ошибки в восьми строках плюс один в вызове просто должен быть чем-то вроде записи, я считаю;).
Кстати, домашняя работа обычно помечена тегом homework
, а не exercise
. (И еще есть ошибка в вашем заголовке Q, так как no classmethod на самом деле вокруг, просто старый добрый и совершенно нормальный экземпляр метод).
Первое, что я вижу неправильно, - это попытка вызвать класс "Игрушка" вместо переменной, представляющей экземпляр "игрушка", переданный вам методом "играть". Я не верю, что вы можете создать экземпляр класса и одновременно вызвать один из его методов, что и делает "Toy(). Play()". Другой заключается в том, что я не совсем уверен, что понимаю, что вы пытаетесь сделать с дизайном своих классов. Вот как я буду реализовывать классы, а затем использовать их для получения желаемого поведения.
class Toy(object):
def play(self):
return "Squeak!"
class Dog(object):
speak = 'Yip! %s'
def __init__(self, name, toy):
self.name = name
self.toy = toy
def play(self,n):
if n > 0:
for each in range(n):
print(self.speak % self.toy.play())
else:
print(None)
и вот как я буду использовать его
Python 2.6.4 (r264:75821M, Oct 27 2009, 19:48:32)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from toy import Toy, Dog
>>> spike = Dog("Spike",Toy())
>>> spike.play(3)
Yip! Squeak!
Yip! Squeak!
Yip! Squeak!
>>>
print
, конечно, сделает это), а затем просто вызватьtoy.play()
(которая печатает остальную часть строки и перевод строки в конце).