Как проверять типы в Python с isintance
Когда нужно проверить отношение объекта к классу в Python используется isinstance(). Описание синтаксиса функции ниже:
isinstance(объект, класс)
Функция возвращает булево значение True или False в зависимости от результата.
Для примера проверим является ли объект строкой:
data = 'Some string' isinstance(data, str)

Так же можно проверять списки и другие массивы:
lst = ['data1', 1] isinstance(lst, list)

Функция позволяет указывать сразу несколько классов для проверки, но все они должны быть помещены в кортеж:
dct = isinstance(dct, (dict, list)) isinstance(dct, (int, list))

В примере ниже проверяется является ли экземпляр класса унаследованным:
class TestClass: def method(self): pass class CurrentClass(TestClass): pass ins = CurrentClass() print( isinstance(ins, TestClass) )

Основное отличие isinstance() от type() как раз в том, что он может проверять принадлежность к нескольким классам и унаследование:
massive = [1,2,3,4,5] if isinstance(massive, (list,set,tuple)): print('Pass: ', massive[1]) if type(massive) is set or type(massive) is list or type(massive) is set: print('Pass: ', massive[1])
Как получить список объектов класса?
Из примера не очень понятно, что всё-таки вам нужно — список объектов, инстанцированных от этого класса? Или список объектов, которые являются аттрибутами класса?
10 ноя 2021 в 7:06
Аттрибутами класса
10 ноя 2021 в 7:36
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Все атрибуты класса можно увидеть с помощью специального метода __dict__ . Правда, туда кроме явно созданных Вами атрибутов попадут и системные атрибуты, но их легко отфильтровать, т.к. их название начинается и заканчивается двойным подчёркиванием:
print( )
UPD на комментарий:
Имея название атрибута, вы всегда можете, как получить его значение
value = getattr(Example, k) print(value)
так и заменить его на новое значение:
setattr(Example, k, new_value_obj)
Определение типа объекта в Python
В процессе работы с Python часто возникает необходимость определения типа объекта. Особенно это актуально в случае когда переменная может быть различных типов данных. Например, при написании функции, которая может принимать разные типы аргументов и выполнять разные действия в зависимости от их типа.
Рассмотрим простой пример. Пусть есть переменная x , которая может быть списком ( list ), словарем ( dict ) или другим типом данных:
x = [1, 2, 3] # это список
x = # это словарь
А как узнать, что это за тип данных? Для этого в Python есть встроенная функция type() .
Вот как она используется:
x = [1, 2, 3] print(type(x)) # <class 'list'> x = print(type(x)) # <class 'dict'>
Функция type() принимает один аргумент и возвращает тип этого аргумента. В результате выполнения этой функции получается строка, которая начинается со слова «class» и далее следует имя класса, которому принадлежит объект.
Однако, если нужно проверить, является ли объект определенным типом, то лучше воспользоваться функцией isinstance() . Эта функция принимает два аргумента: объект, тип которого нужно проверить, и тип данных (или кортеж типов данных), с которым сравнивается тип объекта. Если тип объекта совпадает с указанным типом данных (или одним из указанных типов данных), то функция возвращает True , в противном случае — False .
x = [1, 2, 3] print(isinstance(x, list)) # True print(isinstance(x, dict)) # False x = print(isinstance(x, list)) # False print(isinstance(x, dict)) # True
Таким образом, с помощью функций type() и isinstance() можно легко определить тип данных объекта в Python.
Объекты и классы в Python
Python — объектно-ориентированный язык программирования. В отличие от процедурно-ориентированного программирования, ООП опирается на объекты.
Объект — это набор данных (переменных) и методов (функций), которые с этими данными взаимодействуют.
Представьте чертеж дома. В нем содержится вся информация: сколько этажей, какого размера двери, окна и т. д. На основе это чертежа мы можем построить дом. Дом — это объект.
По одному чертежу можно построить сразу несколько домов. Так же и с классом — по нему можно создать много объектов. Объект также можно назвать экземпляром класса, а процесс его создания — инстанцированием.
Как объявить класс
По аналогии с функциями, которые начинаются с def , объявление класса сопровождается ключевым словом class .
Первая строка внутри класса называется строкой документации, в ней содержится краткое описание класса. Писать ее рекомендуется, но не обязательно.
class MyNewClass: '''Это строка документации. Мы создали новый класс''' pass
Класс создает новое локальное пространство имен, где определяются все атрибуты. Атрибутами могут быть и переменные, и функции.
Есть и специальные атрибуты, которые начинаются с двойного нижнего подчеркивания __ . Например, __doc__ — строка документации класса.
После объявления класса создается объект этого класса с тем же именем. Этот объект класса позволяет нам как получить доступ к различным его атрибутам, так и инстанцировать новые объекты этого класса.
class Person: "Это класс, описывающий человека" age = 10 def greet(self): print('Привет') # Вывод: 10 print(Person.age) # Вывод: print(Person.greet) # Вывод: 'Это мой второй класс' print(Person.__doc__)
Вывод:
10
Это класс, описывающий человека
Как создать объект
Мы уже знаем, что объект класса можно использовать для доступа к различным его атрибутам.
Использовать его можно и для создания новых экземпляров этого класса. Создание объекта похоже на вызов функции.
>>> harry = Person()
Так мы создадим новый экземпляр класса — harry . Доступ к атрибутам объекта осуществляется при помощи префикса имени объекта.
Атрибутами могут быть и переменные, и методы. Методы объекта — функции этого класса.
Это значит следующее: Person.greet — объект функции (атрибут класса), а harry.greet — объект метода.
class Person: "Это класс, описывающий человека" age = 10 def greet(self): print('Привет') # создаем новый объект класса Person harry = Person() # Вывод: print(Person.greet) # Вывод: > print(harry.greet) # Вызов метода greet() объекта # Вывод: Привет harry.greet()
Вывод:
>
Привет
Возможно, вы заметили параметр self в функции класса. Но вызывали метод мы с помощью harry.greet() . И почему-то это сработало.
Так происходит потому, что когда объект вызывает свой метод, сам объект является первым аргументом. То есть harry.greet() это то же самое, что и Person.greet(harry) .
Обычно вызов метода со списком аргументов длины n равносилен вызову соответствующей функции со списком аргументов, который создается путем вставки объекта метода перед первым аргументов.
По этим причинам первый аргумент функции в классе должен быть сам объект. Это и есть self — так договорились программисты на Python. Но в теории можно использовать и другое обозначение.
Теперь вы имеете представление о классах, экземплярах класса, функциях, методах. Главное — понимать их отличия.
Конструкторы
Функции класса, начинающиеся с двойного нижнего подчеркивания, называются специальными функциями.
Наибольший интерес вызывает специальная функция __init__( ). Она вызывается каждый раз, когда вы создаете новый объект класса.
В ООП этот вид функций называют конструкторами. Обычно они используются для инициализации всех переменных класса.
class ComplexNumber: def __init__(self, r=0, i=0): self.real = r self.imag = i def get_data(self): print(f'+j') # Создаем новый объект ComplexNumber num1 = ComplexNumber(2, 3) # Вызываем метод get_data() # Вывод: 2+3j num1.get_data() # Создаем еще один объект ComplexNumber # и новый атрибут 'attr' num2 = ComplexNumber(5) num2.attr = 10 # Вывод: (5, 0, 10) print((num2.real, num2.imag, num2.attr)) # У объекта c1 нет атрибута 'attr', поэтому # вызывается ошибка # AttributeError: 'ComplexNumber' object has no attribute 'attr' print(num1.attr)
Вывод:
2+3j
(5, 0, 10)
Traceback (most recent call last):
File "", line 27, in
print(num1.attr)
AttributeError: 'ComplexNumber' object has no attribute 'attr'
В этом примере мы объявили класс, представляющий комплексные числа. В нем две функции. Первая, __init__() , инициализирует переменные (по умолчанию это нули). Вторая, get_data() , позволяет правильно отображать числа в консоли.
Стоит отметить, что атрибуты объекта могут создаваться «на лету». Мы и создали, и считали атрибут attr объекта num2 . Но это не значит, что этот атрибут будет доступен num1 .
Как удалить атрибуты и объекты
Любой атрибут объекта можно в любой момент удалить. Сделать это можно с помощью оператора del . Попробуйте запустить следующую программу и проверьте, что она выводит.
>>> num1 = ComplexNumber(2,3) >>> del num1.imag >>> num1.get_data()
Traceback (most recent call last):
.
AttributeError: 'ComplexNumber' object has no attribute 'imag'
>>> del ComplexNumber.get_data >>> num1.get_data()
Traceback (most recent call last):
.
AttributeError: 'ComplexNumber' object has no attribute 'get_data'
С помощью del можно удалить даже объект:
>>> c1 = ComplexNumber(1,3) >>> del c1 >>> c1
Traceback (most recent call last):
.
NameError: name 'c1' is not defined
На самом деле всё намного сложнее. Когда мы выполняем строку c1 = ComplexNumber(1,3) , создается новый экземпляр класса. Переменная с1 является ссылкой на него.
После выполнения команды del c1 ссылка и имя c1 удаляются из соответствующего пространства имен. Однако объект все так же будет существовать. Так что если не связать новую переменную с этим объектом, он позже будет автоматически уничтожен.
Удаление объектов, на которые нет ссылок, называется сборкой мусора.
