Однако вы также можете инициализировать объект непосредственно с помощью словаря, поскольку его ключ names совпадает с аргументами функции __init__ (аргументы — ключевые слова рассматриваются в главе 3):
>>> hydrogen = Element(**el_dict)
>>> hydrogen.name
'Hydrogen'
6. Для класса Element определите метод с именем dump(), который выводит на экран значения атрибутов объекта (name, symbol и number). Создайте объект hydrogen из этого нового определения и используйте метод dump(), чтобы вывести на экран его атрибуты:
>>> class Element:
…·····def __init__(self, name, symbol, number):
…·········self.name = name
…·········self.symbol = symbol
…·········self.number = number
…·····def dump(self):
…·········print('name=%s, symbol=%s, number=%s' %
…·············(self.name, self.symbol, self.number))
…
>>> hydrogen = Element(**el_dict)
>>> hydrogen.dump()
name=Hydrogen, symbol=H, number=1
7. Вызовите функцию print(hydrogen). В определении класса Element измените имя метода dump на __str__, создайте новый объект hydrogen и затем снова вызовите метод print(hydrogen):
>>> print(hydrogen)
<__main__.Element object at 0x1006f5310>
>>> class Element:
…·····def __init__(self, name, symbol, number):
…·········self.name = name
…·········self.symbol = symbol
…·········self.number = number
…·····def __str__(self):
…·········return ('name=%s, symbol=%s, number=%s' %
…·············(self.name, self.symbol, self.number))
…
>>> hydrogen = Element(**el_dict)
>>> print(hydrogen)
name=Hydrogen, symbol=H, number=1
__str__() — это один из волшебных методов Python. Функция print вызывает метод объекта __str__(), чтобы получить его строковое представление. Если у объекта нет метода __str__(), он получает метод по умолчанию от его родительского класса Object, который возвращает строку наподобие <__main__.Element object at 0x1006f5310>.
8. Модифицируйте класс Element, сделав атрибуты name, symbol и number закрытыми. Определите геттер, возвращающий значение атрибута, для каждого из них:
>>> class Element:
…·····def __init__(self, name, symbol, number):
…·········self.__name = name
…·········self.__symbol = symbol
…·········self.__number = number
…·····@property
…·····def name(self):
…·········return self.__name
…·····@property
…·····def symbol(self):
…·········return self.__symbol
…·····@property
…·····def number(self):
…·········return self.__number
…
>>> hydrogen = Element('Hydrogen', 'H', 1)
>>> hydrogen.name
'Hydrogen'
>>> hydrogen.symbol
'H'
>>> hydrogen.number
1
9. Определите три класса: Bear, Rabbit и Octothorpe. Для каждого из них определите всего один метод — eats(). Этот метод должен возвращать значения 'berries' (для Bear), 'clover' (для Rabbit) или 'campers' (для Octothorpe). Создайте по одному объекту каждого класса и выведите на экран то, что он ест:
>> class Bear:
…·····def eats(self):
…·········return 'berries'
…
>>> class Rabbit:
…·····def eats(self):
…·········return 'clover'
…
>>> class Octothorpe:
…·····def eats(self):
…·········return 'campers'
…
>>> b = Bear()
>>> r = Rabbit()
>>> o = Octothorpe()
>>> print(b.eats())
berries
>>> print(r.eats())
clover
>>> print(o.eats())
campers
10. Определите три класса: Laser, Claw и SmartPhone. Каждый из них имеет только один метод — does(). Он возвращает значения 'disintegrate' (для Laser), 'crush' (для Claw) или 'ring' (для SmartPhone). Далее определите класс Robot, который содержит по одному объекту каждого из этих классов. Определите метод does() для класса Robot, который выводит на экран все, что делают его компоненты:
>>> class Laser:
…·····def does(self):
…·········return 'disintegrate'
…
>>> class Claw:
…·····def does(self):
…·········return 'crush'
…
>>> class SmartPhone:
…·····def does(self):
…·········return 'ring'
…
>>> class Robot:
…·····def __init__(self):
…·········self.laser = Laser()
…·········self.claw = Claw()
…·········self.smartphone = SmartPhone()
…·····def does(self):
…·········return '''I have many attachments:
… My laser, to %s.
… My claw, to %s.
… My smartphone, to %s.''' % (
…·····self.laser.does(),
…·····self.claw.does(),
…·····self.smartphone.does())
…
>>> robbie = Robot()
>>> print(robbie.does())
I have many attachments:
My laser, to disintegrate.
My claw, to crush.
My smartphone, to ring.
Глава 7. Работаем с данными профессионально
1. Создайте строку Unicode с именем mystery и присвойте ей значение '\U0001f4a9'. Выведите на экран значение строки mystery. Найдите имя Unicode для mystery:
>>> import unicodedata
>>> mystery = '\U0001f4a9'
>>> mystery
' '
>>> unicodedata.name(mystery)
'PILE OF POO'
Ой-ой-ой! Что еще у них там есть?
2. Закодируйте строку mystery, в этот раз с использованием кодировки UTF-8, в переменную типа bytes с именем pop_bytes. Выведите на экран значение переменной pop_bytes:
>>> pop_bytes = mystery.encode('utf-8')
>>> pop_bytes
b'\xf0\x9f\x92\xa9'
3. Используя кодировку UTF-8, декодируйте переменную pop_bytes в строку pop_string. Выведите на экран значение переменной pop_string. Равно ли оно значению переменной mystery?
>>> pop_string = pop_bytes.decode('utf-8')
>>> pop_string
' '
>>> pop_string == mystery
True
4. Запишите следующее стихотворение с помощью старого стиля форматирования. Подставьте строки 'roast beef', 'ham', 'head' и 'clam' в эту строку: