На этом шаге мы рассмотрим особенности создания таких подклассов.
Поскольку объекты namedtuple строятся поверх обычных классов Python, вы даже можете добавлять в них методы. Например, подобно любому другому классу, вы можете расширить класс namedtuple и таким образом добавить в него методы и новые свойства. Приведем пример:
>>> Car = namedtuple('Авто' , 'цвет пробег') >>> class MyCarWithMethods(Car): def hexcolor(self): if self.цвет == 'красный': return '#ff0000' else: return '#000000'
Теперь можно создавать объекты MyCarWithMethods и, следовательно, вызывать их метод hexcolor():
>>> c = MyCarWithMethods('красный', 1234) >>> c.hexcolor() '#ff0000'
Вместе с тем выглядеть это может слегка неуклюжим. По-видимому, такая возможность пригодится, если вам нужен класс с неизменяемыми свойствами, но здесь есть свои неудобства.
Например, в добавлении нового неизменяемого поля (immutable field) есть свои сложности из-за внутренней структуры именованных кортежей. Самый легкий способ создать иерархии именованных кортежей - использовать свойство _fields базового кортежа:
>>> Car = namedtuple('Авто', 'цвет пробег') >>> ElectricCar = namedtuple('ЭлектрическоеАвто', Car._fields + ('заряд',))
Это дает желаемый результат:
>>> ElectricCar('красный', 1234, 45.0) ЭлектрическоеАвто(цвет='красный', пробег=1234, заряд=45.0)
На следующем шаге мы рассмотрим встроенные вспомогательные методы.