Класс object. Строковое представление объекта
Начиная с 3-й версии в языке программирования Python все классы неявно имеют один общий суперкласс - object и все классы по умолчанию наследуют его методы.
Одним из наиболее используемых методов класса object является метод str(). Когда необходимо получить строковое представление объекта или вывести объект в виде строки, то Python как раз вызывает этот метод. И при определении класса хорошей практикой считается переопределение этого метода.
К примеру, возьмем класс Person и выведем его строковое представление, смотрим пример:
При запуске программа выведет что-то наподобие следующего, вторая часть кода:
Это не очень информативная информация об объекте. Мы, конечно, можем выйти из положения, определив в классе Person дополнительный метод, который выводит данные объекта - в примере выше это метод display_info.
🐍 Укус питона // 💬 Чат // #теория #классы #object
Начиная с 3-й версии в языке программирования Python все классы неявно имеют один общий суперкласс - object и все классы по умолчанию наследуют его методы.
Одним из наиболее используемых методов класса object является метод str(). Когда необходимо получить строковое представление объекта или вывести объект в виде строки, то Python как раз вызывает этот метод. И при определении класса хорошей практикой считается переопределение этого метода.
К примеру, возьмем класс Person и выведем его строковое представление, смотрим пример:
При запуске программа выведет что-то наподобие следующего, вторая часть кода:
Это не очень информативная информация об объекте. Мы, конечно, можем выйти из положения, определив в классе Person дополнительный метод, который выводит данные объекта - в примере выше это метод display_info.
🐍 Укус питона // 💬 Чат // #теория #классы #object
Класс object. Строковое представление. Продолжение.
Рассмотрим другой выход решения проблемы недостаточной информации об объекте - определим в классе Person метод str() (по два подчеркивания с каждой стороны), смотрим код:
Метод str должен возвращать строку. И в данном случае мы возвращаем базовую информацию о человеке. Если нам потребуется использовать эту информацию в других методах класса, то мы можем использовать выражение self.str()
И теперь консольный вывод будет другим, нижняя часть примера:
🐍 Укус питона // 💬 Чат // #теория #классы #object
Рассмотрим другой выход решения проблемы недостаточной информации об объекте - определим в классе Person метод str() (по два подчеркивания с каждой стороны), смотрим код:
Метод str должен возвращать строку. И в данном случае мы возвращаем базовую информацию о человеке. Если нам потребуется использовать эту информацию в других методах класса, то мы можем использовать выражение self.str()
И теперь консольный вывод будет другим, нижняя часть примера:
🐍 Укус питона // 💬 Чат // #теория #классы #object
Классы в pattern matching
Python позволяет использовать в pattern matching в качестве шаблонов объекты классов. Рассмотрим на примере:
Здесь определен класс Person, который через конструктор принимает значения для атрибутов self.name и self.age.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Python позволяет использовать в pattern matching в качестве шаблонов объекты классов. Рассмотрим на примере:
Здесь определен класс Person, который через конструктор принимает значения для атрибутов self.name и self.age.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Классы в pattern matching. Продолжение.
Функция print_person принимает параметр Person, который, как предполагается, представляет объект класса Person. И внутри функции конструкция match сравнивает значение параметра person с рядом шаблонов. Каждый шаблон представляет собой определение Person, где с каждым атрибутом сопоставляется некоторое значение. Например, первый шаблон строго определяет значения обоих атрибутов, смотрим:
Данный шаблон соответствует объекту Person, если у этого объекта атрибут name имеет значение "Tom", а атрибут age - значение 37.
Стоит отметить, что этот шаблон - это НЕ вызов конструктора Person. Шаблон просто устанавливает, как атрибуты сопоставляются со значениями.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Функция print_person принимает параметр Person, который, как предполагается, представляет объект класса Person. И внутри функции конструкция match сравнивает значение параметра person с рядом шаблонов. Каждый шаблон представляет собой определение Person, где с каждым атрибутом сопоставляется некоторое значение. Например, первый шаблон строго определяет значения обоих атрибутов, смотрим:
Данный шаблон соответствует объекту Person, если у этого объекта атрибут name имеет значение "Tom", а атрибут age - значение 37.
Стоит отметить, что этот шаблон - это НЕ вызов конструктора Person. Шаблон просто устанавливает, как атрибуты сопоставляются со значениями.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Классы в pattern matching. Продолжение.
Второй шаблон строго задает значение только для атрибута age, первый пример:
Для соответствия этому шаблону атрибут age должен быть равен 37. А атрибут name может иметь произвольное значение. И это значение передается переменной name. А запись name=name расшифровывается как атрибут_объекта=переменная. А в вызове print(f"Name: {name}") на консоль выводится значение переменной name, которая получила значение атрибута name.
В данном случае и атрибут, и переменная имеют одинаковое значение, но это необязательно, и для переменной можно было использовать другое значение, второй например:
Третий шаблон соответствует объекту Person, у которого атрибут name равен строке "Tom". А значение атрибута age передается в переменную age, третья часть:
И в последнем шаблоне атрибуты name и age могут иметь произвольные значения. И эти значения передаются одноименным переменным, последняя часть:
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Второй шаблон строго задает значение только для атрибута age, первый пример:
Для соответствия этому шаблону атрибут age должен быть равен 37. А атрибут name может иметь произвольное значение. И это значение передается переменной name. А запись name=name расшифровывается как атрибут_объекта=переменная. А в вызове print(f"Name: {name}") на консоль выводится значение переменной name, которая получила значение атрибута name.
В данном случае и атрибут, и переменная имеют одинаковое значение, но это необязательно, и для переменной можно было использовать другое значение, второй например:
Третий шаблон соответствует объекту Person, у которого атрибут name равен строке "Tom". А значение атрибута age передается в переменную age, третья часть:
И в последнем шаблоне атрибуты name и age могут иметь произвольные значения. И эти значения передаются одноименным переменным, последняя часть:
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Классы в pattern matching. Продолжение.
Также мы можем применить паттерн _, если нам надо обработать случаи, которые не соответствуют ни одному шаблону, смотрим код:
В данном случае второй шаблон Person(name=person_name) соответствует любому объекту Person, при этом значение атрибута name передается переменной person_name
А последний шаблон обрабатывает случаи, когда передано значение, которое не представляет объект Person.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Также мы можем применить паттерн _, если нам надо обработать случаи, которые не соответствуют ни одному шаблону, смотрим код:
В данном случае второй шаблон Person(name=person_name) соответствует любому объекту Person, при этом значение атрибута name передается переменной person_name
А последний шаблон обрабатывает случаи, когда передано значение, которое не представляет объект Person.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Передача набора значений.
Также с помощью вертикальной черты можно определить набор значений, которые должен иметь атрибут, смотрим код:
В данном случае первый шаблон соответствует объекту Person, у которого атрибут name имеет одно из трех значений: "Tom", "Tomas" или "Tommy".
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Также с помощью вертикальной черты можно определить набор значений, которые должен иметь атрибут, смотрим код:
В данном случае первый шаблон соответствует объекту Person, у которого атрибут name имеет одно из трех значений: "Tom", "Tomas" или "Tommy".
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Передача набора значений. Продолжение.
Также можно задавать альтернативные значения для всего шаблона в том числе с помощью объектов других классов:
Здесь первый шаблон соответствует любому объекту Person, у которого атрибут name = "Tom, и любому объекту Student, у которого атрибут name = "Tomas".
Второй шаблон - case Person(name=name) | Student(name=name) соответствует любому объекту Person и Student.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Также можно задавать альтернативные значения для всего шаблона в том числе с помощью объектов других классов:
Здесь первый шаблон соответствует любому объекту Person, у которого атрибут name = "Tom, и любому объекту Student, у которого атрибут name = "Tomas".
Второй шаблон - case Person(name=name) | Student(name=name) соответствует любому объекту Person и Student.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
Позиционные параметры
В примерах из прошлых постов для определения атрибутов прописывалось их имя: case Person(name="Tom", age=37). Но если используется куча шаблонов, и в каждом необходимо связать атрибуты объекта с некоторыми значениями или переменными, то постоянное упоминание атрибутов можно несколько раздуть код. Но Python также позволяет использовать позиционные параметры, смотрим код:
Обратите внимание в классе Person на вызов функции. Благодаря этому Python будет знать, что при указании атрибутов атрибут name будет идти первым, а атрибут age - вторым.
И таким образом, в шаблонов не нужно указывать имя атрибута: case Person("Tom", 37) - Python сам сопоставит атрибуты и значения/переменные на основе их позиции.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы
В примерах из прошлых постов для определения атрибутов прописывалось их имя: case Person(name="Tom", age=37). Но если используется куча шаблонов, и в каждом необходимо связать атрибуты объекта с некоторыми значениями или переменными, то постоянное упоминание атрибутов можно несколько раздуть код. Но Python также позволяет использовать позиционные параметры, смотрим код:
Обратите внимание в классе Person на вызов функции. Благодаря этому Python будет знать, что при указании атрибутов атрибут name будет идти первым, а атрибут age - вторым.
И таким образом, в шаблонов не нужно указывать имя атрибута: case Person("Tom", 37) - Python сам сопоставит атрибуты и значения/переменные на основе их позиции.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #классы