Великан

По склону холма к мосту спускался великан, самый настоящий и весьма неопрятный на вид. Корнуолл прикинул, что росту в нем добрых двенадцать футов. По сравнению с телом голова великана была на удивление маленькой, не больше, а может, даже меньше головы обыкновенного человека. Великанье тело, пускай крупное, вовсе не производило впечатления чего-то внушительного; оно было жирным и дряблым. Великан был одет в короткий килт и рубашку с помочами. Двигался он медленно и неуклюже, земля проседала под его ногами. Руки его безвольно свисали вдоль тела, именно свисали, а не двигались, как у людей, в такт шагам.

Напишите два класса: Giant (Великан) и его наследник UsualMan (Обычный человек).

Великан инициализируется с позиционным аргументом – именем и произвольным числом именованных аргументов: свойство – значение свойства.

Класс обеспечивает работу методов (gn – экземпляр класса):

gn[key] – получить значение свойства по ключу;

gn[key] = value – добавить или изменить значение по ключу;

iter(gn) – вернуть итератор из словаря свойств;

__str__ – вернуть строку с информацией в виде:

<Имя класса> <Имя> with the number of properties <количество>.

Экземпляр класса UsualMan инициализируется с именем и произвольным количеством позиционных аргументов-свойств, которые затем образуют словарь со всеми значениями, равными единице.

Класс реализует функциональность (um – экземпляр класса):

len(um) – вернуть длину словаря свойств;

экземпляр класса можно вызвать с аргументом – именем свойства; если такое свойство есть, его значение увеличивается на 1, если нет, то оно создаётся со значением 1.