Дескриптор: как снять вопросы и “трение” новых пользователей
Распространенная проблема многих сайтов, особенно малоизвестных компаний — это недостаточная ясность того, о чем этот сайт. Часто публикуется только логотип, который может быть и красив, но не отвечает на вопросы, которые интересуют пользователей при первом визите: “Куда я попал? Это то что мне нужно? О чём этот сайт? Чем он может быть полезен?”. Так, например, на сайте 220 Вольт отсутствует дескриптор, а из-за логотип складывается впечатление, что на сайте продается только проводной электроинстурмент. Но на самом деле, на сайте продается гораздо больше категорий товаров (сантехника, спецодежда, беспроводные инструменты, строительные смеси, крепеж и даже настольные игры), но это совершенно не ясно исходя из логотипа 220 Вольт.
Для того, чтобы ответить на эти вопросы, добавляется дескриптор или подпись рядом с логотипом. Дескриптор это (от лат. descriptor описывающий) — краткое описание сайта, его основной смысл или направления деятельности. Дескриптор добавляется в левом верхнем углу, рядом с логотипом, так как именно из левого-верхнего угла чаще всего начинает свой путь взгляд пользователя. Делается это для того, чтобы с самого начала сориентировать пользователя впервые попавшего на сайт.
Отсутствие дескриптора
Наиболее распространенная ошибка связанная с дескриптором — это его отсутствие. Обратите внимание на примеры ниже. Слева логотип “Петрович” без дескриптора. Пользователю впервые попавшему на сайт может быть не сразу понятно, куда он попал и чему посвящен данный сайт. Полистав сайт какое-то время, пользователю становится понятно, что Петрович — это магазин строительного оборудования и инструментов. Но это расходует время и терпение, а также повышает количество вопросов и сомнений. В ходе тестов некоторые пользователи уходили с сайта, посчитав, что необходимых товаров на сайте нет. Но они были. Поэтому лучше добавить дескриптор, который снимет лишние вопросы и сэкономит время пользователям. Вот как это реализовано на 2-ом и 3-ем примерах ниже (Мир инструмента и Кувалда.ру).
Непонятный дескриптор
Ещё одна ошибка — это непонятный дескриптор. На примере ниже слева у Ситилинка дескриптор “Электронный дискаунтер”, что может трактоваться как дискаунтер в электронном виде, а вовсе не дискаунтер электроники. К тому же не всем может быть известно слово “дискаунтер”. Другой пример ниже справа у Комуса дескриптор “Интернет-гипермаркет”, что также вызывает вопросы гипермаркет каких товаров, продовольственных или непродовольственных, товаров для офиса или для дома и т.п. Не все могут понимать, что само слово “гипермаркет” означает большой магазин продающий различные товары.
Ниже примеры более понятных дескрипторов. Так ниже слева у DNS дескриптор “Цифровая и бытовая техника”, что гораздо понятнее чем “Электронный дискаунтер” у Ситилинка (сверху). А ниже справа у Hoff дескриптор “Гипермаркеты мебели и товаров для дома”, что также гораздо понятнее, чем “Интернет-гипермакет” у Комуса (сверху).
Точка роста конверсии: добавьте дескриптор рядом с логотипом, сделайте его простым и понятным.
В данной статье рассмотрена лишь одна точка роста конверсии. Узнать ещё 100+ точек роста конверсии и UX-исследований можно в электронном учебнике Conversant.
Что такое дескриптор и как его составить для лендинга
Всем — привет. Продолжаем говорить о том, как правильно составить тексты для лендинг пейдж и сегодня поговорим о дескрипторе.
Дескриптор — это текстовый элемент на landing page, который, обычно, располагается возле логотипа в левом верхнем углу. Он не обязательно должен быть именно там, но его наличие очень важно в первые секунды взаимодействия с посадочной страницей.
Цель дескриптора — сразу дать пользователю понять, куда он попал. То есть объяснить, что вы делаете, с каким товаром или услугой и, опционально, для кого или в каком регионе.
- пошаговые инструкции по самостоятельному созданию landing page;
- производство и продажа бетона в Москве;
- доставка пиццы в Железнодорожном;
- Лутбоксы Minecraft для фанатов и гиков
Как видите, каждый из примеров сразу дает понять, о чем сайт и отвечает на 3 вопроса, которые выделены жирным выше. Это своего рода формула для создания успешного дескриптора.
- Что вы делаете и чем занимаетесь? (производства, продажа, разработка, настройка).
- С каким товаром или услугой? (бетон, landing page, пицца, пластиковые окна).
- Для кого или в каком регионе? (в Москве, для фанатов и гиков, по всей Украине, по всему Миру).
Важно в первые секунды дать понять, чем вы занимаетесь, так как поведения большинства пользователей таково, что они открывают 5 — 10 вкладок и на изучение страницы отводится всего несколько секунд, если сразу непонятно куда попал, то вкладка закрывается и процесс повторяется, но уже со следующим сайтом.
Поэтому, важно уделить внимание дескриптору и составить его по предложенной формуле. Как я уже говорил ранее, обычно дескриптор располагают в левом верхнем углу сайта, возле логотипа или вместо него. Это связано с тем, что люди уже привыкли видеть его именно там.
Кроме того, проводилось исследования, которые выявили, что люди, чаще всего, изучают web-контент по F-образному паттерну. Вот тепловые карты:
Тепловая карта, объединяющая поведение взгляда миллионов человек, участвующих в исследованиях
Поэтому, велика вероятность, что пользователь уйдет с сайта, если не найдет нужную ему информацию в левом верхнем углу. Не имеет значения статья это, главная страница или еще что-то, нам важно зацепить читателя, дать понять, что он попал куда нужно и найдет здесь то, что ищет. Тогда, велика вероятность, что он продолжит изучение нашей страницы, а не перейдет к другой вкладке.
Вывод
Таким образом, дескриптор один из главных элементов на лендинге, дающий понять, что на этом сайте предлагают. Если пользователя устраивает ответ, то они изучает контент дальше, если нет — то уходит. Поработайте над своим дескриптором и сделайте его по предложенной выше формуле. Это должно повлиять на показатель отказов в лучшую сторону и повысить конверсию.
А на сегодня — все. В следующий статье мы разберем еще один элемент из структуры landing page и поговорим как составить текст для него.
Дескриптор и логотип
Дескриптор – один из важнейших элементов посадочной страницы, обычно работает в паре с логотипом. Этот элемент дает понять посетителю вашего сайта, куда он попал и что ему здесь предлагают. Когда человек заходит на какой-то ресурс или страницу в Интернете, то первые два вопроса, возникающие у него: «Где я?» и «Туда ли я попал?». Если на эти вопросы получен удовлетворительный ответ, он продолжает изучение сайта, если нет – закрывает страницу и уходит.
Самое важное, что нужно помнить: дескриптор всегда важнее логотипа!
Дескриптор – это краткое и емкое описание того, чем вы занимаетесь. В идеале он формулируется максимум четырьмя словами, например: «Интернет-магазин плюшевых медведей» или «Юридические услуги для малого бизнеса». Посетителю четко и в лаконичной форме показывают, что конкретно его ожидает на вашей странице.
Какие еще отличительные черты дескриптора можно отметить?
1. Он должен точно описывать деятельность вашей компании. Например, «Лаборатория интернет-продаж» – звучит непонятно. Какие услуги предлагает эта компания? А вот дескриптор типа «Создание Landing Page» ясно показывает, что организация занимается разработкой посадочных страниц.
2. Он может описывать специализацию. Чем больше конкретики, тем лучше, так что смело используйте прием идентификации в дескрипторе. Например, не «Психологическая помощь», а «Семейный психолог для пар за 50», не «Юристы», а «Юридическая помощь при разводах».
3. Сразу может показать одну из ключевых выгод. Яркий пример такого дескриптора – «Система вентиляции под ключ». Иными словами, мы уже в дескрипторе как бы говорим нашим клиентам о том, что это не просто система вентиляции – это решение проблемы «под ключ», которое не нуждается в дополнительных действиях.
Руководство к дескрипторам
В этой статье я расскажу о том, что такое дескрипторы, о протоколе дескрипторов, покажу как вызываются дескрипторы. Опишу создание собственных и исследую несколько встроенных дескрипторов, включая функции, свойства, статические методы и методы класса. С помощью простого приложения покажу, как работает каждый из них, приведу эквиваленты внутренней реализации работы дескрипторов кодом на чистом питоне.
Изучение того, как работают дескрипторы, откроет доступ к большему числу рабочих инструментов, поможет лучше понять как работает питон, и ощутить элегантность его дизайна.
Введение и определения
Если говорить в общем, то дескриптор — это атрибут объекта со связанным поведением (англ. binding behavior), т.е. такой, чьё поведение при доступе переопределяется методами протокола дескриптора. Эти методы: __get__ , __set__ и __delete__ . Если хотя бы один из этих методов определён для объекта, то он становится дескриптором.
Стандартное поведение при доступе к атрибутам — это получение, установка и удаление атрибута из словаря объекта. Например, a.x имеет такую цепочку поиска атрибута: a.__dict__[‘x’] , затем в type(a).__dict__[‘x’] , и далее по базовым классам type(a) не включая метаклассы. Если же искомое значение — это объект, в котором есть хотя бы один из методов, определяющих дескриптор, то питон может изменить стандартную цепочку поиска и вызвать один из методов дескриптора. Как и когда это произойдёт зависит от того, какие методы дескриптора определены для объекта. Дескрипторы вызываются только для объектов или классов нового стиля (класс является таким, если наследует от object или type ).
Дескрипторы — это мощный протокол с широкой областью применения. Они являются тем механизмом, который стоит за свойствами, методами, статическими методами, методами класса и вызовом super() . Внутри самого питона с их помощью реализуются классы нового стиля, которые были представлены в версии 2.2. Дескрипторы упрощают понимание нижележащего кода на C, а также представляют гибкий набор новых инструментов для любых программ на питоне.
Протокол дескрипторов
Собственно это всё. Определите любой из этих методов и объект будет считаться дескриптором, и сможет переопределять стандартное поведение, если его будут искать как атрибут.
Если объект определяет сразу и __get__ , и __set__ , то он считается дескриптором данных (англ. data descriptor). Дескрипторы, которые определили только __get__ называются дескрипторами не данных (англ. non-data descriptors). Их называются так, потому что они используют для методов, но другие способы их применения также возможны.
Дескрипторы данных и не данных отличаются в том, как будет изменено поведение поиска, если в словаре объекта уже есть запись с таким же именем как у дескриптора. Если попадается дескриптор данных, то он вызывается раньше, чем запись из словаря объекта. Если в такой же ситуации окажется дескриптор не данных, то запись из словаря объекта имеет преимущество перед этим дескриптором.
Чтобы создать дескриптор данных только для чтения, определите и __get__ , и __set__ , и сделайте так, чтобы __set__ выбрасывал исключение AttributeError . Определения метода __set__ и выбрасывания исключения достаточно, чтобы этот дескриптор считался дескриптором данных.
Вызов дескрипторов
Дескриптор можно вызвать напрямую через его метод. Например, d.__get__(obj) .
Однако, наиболее частый вариант вызова дескриптора — это автоматический вызов во время доступа к атрибуту. Например, obj.d ищет d в словаре obj . Если d определяет метод __get__ , то будет вызван d.__get__(obj) . Вызов будет сделан согласно правилам, описанным ниже.
Детали вызова различаются от того, чем является obj — объектом или классом. В любом случае, дескрипторы работают только для объектов и классов нового стиля. Класс является классом нового стиля, если он является потомком object .
Для объектов алгоритм реализуется с помощью object.__getattribute__ , который преобразует запись b.x в type(b).__dict__[‘x’].__get__(b, type(b)) . Реализация работает через цепочку предшественников, в которой дескрипторы данных имеют приоритет перед переменными объекта, переменные объекта имеют приоритет перед дескрипторами не данных, и самый низкий приоритет у метода __getattr__ , если он определён. Полную реализацию на языке C можно найти в PyObject_GenericGetAttr() в файле Objects/object.c .
Для классов алгоритм реализуется с помощью type.__getattribute__ , который преобразует запись B.x в B.__dict__[‘x’].__get__(None, B) . На чистом питоне это выглядит так:
- дескрипторы вызываются с помощью метода __getattribute__
- переопределение __getattribute__ прекратит автоматический вызов дескрипторов
- __getattribute__ доступен только внутри классов и объектов нового стиля
- object.__getattribute__ и type.__getattribute__ делают разные вызовы к __get__
- дескрипторы данных всегда имеют преимущество перед переменными объекта
- дескрипторы не данных могут потерять преимущество из-за переменных объекта
Примечание: в питоне 2.2, super(B, obj).m() вызывал __get__ только если m был дескриптором данных. В питоне 2.3, дескрипторы не данных тоже вызываются, за исключением тех случаев, когда используются классы старого стиля. Детали реализации можно найти в super_getattro() в файле Objects/typeobject.c , а эквивалент на чистом питоне можно найти в пособии от Guido.
Детали выше описывают, что алгоритм вызова дескрипторов реализуется с помощью метода __getattribute__() для object , type и super . Классы наследуют этот алгоритм, когда они наследуют от object или если у них есть метакласс, реализующий подобную функциональность. Таким образом, классы могут отключить вызов дескрипторов, если переопределят __getattribute__() .
Пример дескриптора
Следующий код создаёт класс, чьи объекты являются дескрипторам данных и всё, что они делают — это печатают сообщение на каждый вызов get или set . Переопределение __getattribute__ — это альтернативный подход, с помощью которого мы могли бы сделать это для каждого атрибута. Но если мы хотим наблюдать только за отдельными атрибутами, то это проще сделать с помощью дескриптора.
Этот простой протокол предоставляет просто увлекательные возможности. Некоторые из них настолько часто используются, что были объединены в отдельные функции. Свойства, связанные и несвязанные методы, статические методы и методы класса — все они основаны на этом протоколе.
Свойства
Вызова property() достаточно, чтобы создать дескриптор данных, который вызывает нужные функции во время доступа к атрибуту. Вот его сигнатура:
В документации показано типичное использование property() для создания управляемого атрибута x :
Вот эквивалент property на чистом питоне, чтобы было понятно как реализовано property() с помощью протокола дескрипторов:
Встроенная реализация property() может помочь, когда существовал интерфейс доступа к атрибуту и произошли какие-то изменения, в результате которых понадобилось вмешательство метода.
Например, класс электронной таблицы может давать доступ к значению ячейки через Cell(‘b10’).value . В результате последующих изменений в программе, понадобилось сделать так, чтобы это значение пересчитывалось при каждом доступе к ячейке, однако программист не хочет менять клиентский код, который обращается к атрибуту напрямую. Эту проблему можно решить, если обернуть атрибут value с помощью дескриптора данных, который будет создан с помощью property() :
Функции и методы
В питоне все объектно-ориентированные возможности реализованы с помощью функционального подхода. Это сделано совсем незаметно с помощью дескрипторов не данных.
Словари классов хранят методы в виде функций. При определении класса, методы записываются с помощью def и lambda — стандартных инструментов для создания функций. Единственное отличие этих функций от обычных в том, что первый аргумент зарезервирован под экземпляр объекта. Этот аргумент обычно называется self , но может называться this или любым другим словом, которым можно называть переменные.
Для того, чтобы поддерживать вызов методов, функции включают в себя метод __get__ , который автоматически делает их дескрипторами не данных при поиске атрибутов. Функции возвращают связанные или не связанные методы, в зависимости от того, через что был вызван этот дескриптор.
С помощью интерпретатора мы можем увидеть как на самом деле работает дескриптор функции:
Вывод интерпретатора подсказывает нам, что связанные и несвязанные методы — это два разных типа. Даже если они могли бы быть реализованы таким образом, на самом деле, реализация PyMethod_Type в файле Objects/classobject.c содержит единственный объект с двумя различными отображениями, которые зависят только от того, есть ли в поле im_self значение или там содержится NULL (C эквивалент значения None ).
Таким образом, эффект вызова метода зависит от поля im_self . Если оно установлено (т.е. метод связан), то оригинальная функция (хранится в поле im_func ) вызывается, как мы и ожидаем, с первым аргументом, установленным в значение экземпляра объекта. Если же она не связана, то все аргументы передаются без изменения оригинальной функции. Настоящая C реализация instancemethod_call() чуть более сложная, потому что включает в себя некоторые проверки типов и тому подобное.
Статические методы и методы класса
Дескрипторы не данных предоставляют простой механизм для различных вариантов привязки функций к методам.
Повторим ещё раз. Функции имеют метод __get__ , с помощью которых они становятся методами, во время поиска атрибутов и автоматического вызова дескрипторов. Дескрипторы не данных преобразуют вызов obj.f(*args) в вызов f(obj, *args) , а вызов klass.f(*args) становится f(*args) .
В этой таблице показано связывание и два наиболее популярных варианта:
Преобразование | Вызвана через объект | Вызвана через класс | |
---|---|---|---|
Дескриптор | функция | f(obj, *args) | f(*args) |
staticmethod | f(*args) | f(*args) | |
classmethod | f(type(obj), *args) | f(klass, *args) |
Статические методы возвращают функцию без изменений. Вызовы c.f или C.f эквиваленты вызовам object.__getattribute__(c, «f») или object.__getattribute__(C, «f») . Как результат, функция одинаково доступна как из объекта, так и из класса.
Хорошими кандидатами для статических методов являются методы, которым не нужна ссылка на переменную self .
Например, пакет для статистики может включать класс для экспериментальных данных. Класс предоставляет обычные методы для расчёта среднего, ожидания, медианы и другой статистики, которая зависит от данных. Однако, там могут быть и другие функции, которые концептуально связаны, но не зависят от данных. Например, erf(x) это простая функция для преобразования, которая нужна в статистике, но не зависит от конкретного набора данных в этом классе. Она может быть вызвана и из объекта, и из класса: s.erf(1.5) —> 0.9332 или Sample.erf(1.5) —> 0.9332 .
Так как staticmethod() возвращает функцию без изменений, то этот пример не удивляет:
Если использовать протокол дескриптора не данных, то на чистом питоне staticmethod() выглядел бы так:
В отличие от статических методов, методы класса подставляют в начало вызова функции ссылку на класс. Формат вызова всегда один и тот же, и не зависит от того, вызываем мы метод через объект или через класс.
Это поведение удобно, когда нашей функции всегда нужна ссылка на класс и ей не нужны данные. Один из способов использования classmethod() — это создание альтернативных конструкторов класса. В питоне 2.3, метод класса dict.fromkeys() создаёт новый словарь из списка ключей. Эквивалент на чистом питоне будет таким:
Теперь новый словарь уникальных ключей можно создать таким образом:
Если использовать протокол дескриптора не данных, то на чистом питоне classmethod() выглядел бы так: