Этот код подразумевает "отношение" класса и метода?

70
7

Я работаю над упражнениями на тренажере. Я не понимаю одно из упражнений. Моя задача - написать небольшой модуль, который будет импортироваться во время выполнения.

Код ниже является частью упражнения, и ни Allergies ни is_allergic_to не определены в тестовом файле. Это зависит от меня, чтобы определить их в моем модуле.

def test_has_the_right_allergies(self):
allergies = Allergies(5)
self.assertTrue(allergies.is_allergic_to('eggs'))

Я действительно не ищу решения, а также простое руководство по тому, что видит хороший программист, и если это правда, что я должен подойти к решению с помощью класса и метода или просто две функции с объектом, способным к методу (например, КАКИЕ-ЛИБО ТОГО, ЧТО может быть)

Как программист-хобби, у меня возникли проблемы с пониманием синтаксиса. Я читаю is_allergic_to как метод, но я не знаю, какой тип объекта возвращается вызовом для Allergies() По сути, делает ли код, что я создаю is_allergic_to Allergies, у которого есть метод is_allergic_to?

спросил(а) 2014-10-26T07:43:00+03:00 5 лет, 11 месяцев назад
1
Решение
58

В Python методы в классах действительно не отличаются от обычных методов, за исключением следующих двух способов:

Они помещаются в класс. Это означает, что вам нужно сначала обратиться к классу, прежде чем вы сможете "увидеть" или вызвать метод.

Они автоматически передают экземпляр (или класс) в качестве первого аргумента. Этот первый аргумент обычно называется "я", но его можно назвать чем-то другим. Вы также можете опустить это, если метод должен работать над самим классом, а не с экземплярами.

Таким образом, "способ, способный к объекту", - это просто метод, определенный в классе, который принимает экземпляр как первый аргумент:

class Foo(object):
def some_method(self, a, b):
self.foo = a
self.bar = b
return a+b

obj = Foo()
result = obj.some_method(1, 3) # 'obj' is passed in as the instance (ie, self)
print(result) # This will print 4
print(obj.foo) # 1
print(obj.bar) # 3

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

result = Foo.some_method(obj, 1, 3)  # Not encouraged

В вашем примере возвращаемый объект is_allergic_to может возвращать выражение (или значение) "true" или "falsey", что ожидает assertTrue:

assertTrue(expr, msg=None)
assertFalse(expr, msg=None)

Test that expr is true (or false).

Одним из возможных способов написания метода было бы:

class Allergies(object):
# other methods here

def __init__(self, name):
self.allergies = [] # an empty list, to store allergies
self.name = name

def add_allergy(self, allergy):
self.allergies.append(allergy)

def is_allergic_to(self, allergy):
return allergy in self.allergies

ответил(а) 2014-10-26T08:24:00+03:00 5 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема