Мне нужно создать класс с двумя методами. Это упражнение:
Это мой код попытки:
class Cats():
def __init__(self, name, breed, size):
self.name = name
self.breed = breed
self.size = size
def friends(self, cat2):
print(self.name, 'and', cat2.name, 'are friends')
def fight(cat1, cat2):
if cat1.size == 'Big' and cat2.size == 'Small':
print(cat1.name, 'Win the fight')
elif cat2.size == 'Big' and cat1.size == 'Small':
print(cat2.name, 'Win the fight')
else:
print('There is no fight, they are friends')
Предположим:
cat1 = Cats('Tommy','breedx','Big')
cat2 = Cats('Garfield','breedy','Small')
fight(cat1,cat2)
Ожидаемый результат будет следующим:
Tommy Win the fight
Вывод, который я получаю:
Может ли кто-нибудь предложить мне, как правильно сделать мой код? Я немного смущен.
Вау, я не могу поверить, что это была ошибка! Да, у меня это сработало, большое спасибо @mkrieger1
class Cats():
def __init__(self, name, breed, size):
self.name = name
self.breed = breed
self.size = size
def friends(self, cat2):
print(self.name, 'and', cat2.name, 'are friends')
def fight(cat1, cat2):
if cat1.size == 'Big' and cat2.size == 'Small':
print(cat1.name, 'Win the fight')
elif cat2.size == 'Big' and cat1.size == 'Small':
print(cat2.name, 'Win the fight')
else:
print('There is no fight, they are friends')
Переместите функцию боя за пределы вашего класса.
Это потому, что fight
— это метод класса Cats() (рекомендация, не используйте множественное число в именах классов, потому что объект — это кошка, а не много кошек). Поскольку fight
— это метод, его должен вызывать объект Cat, то есть cat1.fight(cat2)
, например.
Другое решение, если вы хотите, чтобы функция не зависела от объекта, вы должны определить fight
вне класса. То есть:
class Cats():
def __init__(self, name, breed, size):
self.name = name
self.breed = breed
self.size = size
def friends(self, cat2):
print(self.name, 'and', cat2.name, 'are friends')
def fight(cat1, cat2):
if cat1.size == 'Big' and cat2.size == 'Small':
print(cat1.name, 'Win the fight')
elif cat2.size == 'Big' and cat1.size == 'Small':
print(cat2.name, 'Win the fight')
else:
print('There is no fight, they are friends')
Функция fight
определена внутри класса Cat, поэтому вы не можете получить к ней глобальный доступ без ссылки на объект типа Cat.
Если вы хотите, чтобы функция оставалась внутри класса Cat, вы можете изменить ее на:
def fight(self, cat2):
if self.size == 'Big' and cat2.size == 'Small':
print(self.name, 'Win the fight')
elif cat2.self == 'Big' and self.size == 'Small':
print(cat2.name, 'Win the fight')
else:
print('There is no fight, they are friends')
и звоните по cat1.fight(cat2)
.
В качестве альтернативы вы можете просто выйти fight
из класса и продолжить звонить fight(cat1, cat2)
Переместите функцию
fight
из классаCats
, если вы хотите вызывать ее так, как пытались. В противном случае позвонитеcat1.fight(cat2)
вместо этого.