class Shepherd:
...
def set_sheep_color(self, color):
for s in self.sheep:
s.set_color(color)
Имена, которые прикреплены к объекту, не проверяются до тех пор, пока строка кода фактически не будет выполнена. Не имеет значения, если вы определяете до того, как определите класс Sheep; это имеет значение только, если вы используете до запускаете класс овец. Что вы явно уже сделали, так как вы инициализировали Пастыря с некоторым количеством овец, которые должны уже существовать.
Другими словами, когда python смотрит на переменные и методы, прикрепленные к объекту, он смотрит на объект в том виде, в котором он существует , а не на спецификацию объекта.