- 1. Виды типизации
- 2. Типизация python
- 3. Что такое переменная
- 4. Числа в python
- 5. Строки в python
- 6. Списки и кортежи в python
- 7. Словарь в python
- 8. Какие типы данных относятся к структурам данных
- 9. Что такое Git
- 10. Как создать Git репозиторий локально
- 11. Что такое git push
- 12. Что делает git commit
- 13. Git merge и rebase
- 14. Что такое виртуальное окружение
- 15. Как установить виртуальное окружение
- 16. Виды форматирования строк
- 17. Cрезы или слайсы в python
- 18. Что такое итерация
- 19. Какие циклы есть в python
- 20. Чем отличается while от for
- 21. Каким образом реализовано ветвление в python
- 22. Как запросить у пользовптеля ввод
- 23. Преобразование типов
- 24. Что такое аннотация типов
- 25. Строка это последовательность или нет
- 26. Что такое PEP8
- 27. Что такое фунция range
- 28. Что делает enumerate
- 29. Какие методы списков
- 30. Что в python не является объектом
- 31. Название переменных
- 32. Что такое литералы
- 33. Можно ли число сделать строкой
- 34. Что делает метод split()
- 35. Что делает метод join()
- 36. Как импортировать модуль
- 37. Как импортировать все содержимое модуля
- 38. Сколько пар ключ значение может быть в словаре
- 39. Какой тип данных может быть значением в словаре
- 40. Как узнать id элемента
- 41. Как узнать версию python
- 42. Отличия второго python от 3
- 43. Как прервать выполнение цикла
- 44. Что означает continue
- 45. Что будет если сравнить 5 и 5.0
- 46. Что быстрее python или c++
- 47. Что такое байт код
- 48. Как избежать конфликтов при импорте файлов
- 49. Что означает %s %d
- 50. Что такое класс
- 51. Что такое наследование
- 52. Что такое инкапсуляция
- 53. Что такое полиморфизм
- 54. Сколько может быть родителей и наследников у класса
- 55. Что такое перегрузка операторов
- 56. Магические методы
- 57. Модификаторы доступа
- 58. Генераторы
- 59. Как пишутся комментарии в python
- 60. Как можно обратить (reverse) порядок элементов в списке
- 61. Если мы не поставим двоеточие в конце строки для цикла "do-while", он все равно сработает?
- 62. Как убрать из списка дубликат элемента
- 63. Расскажите про арифметические операторы //, %, и **
- 64. Как посчитать длину строки (string)
- 65. Расскажите про генераторы списков (list comprehension)
- 66. Что такое HTTP
- 67. Что такое json, xml
- 68. Чем отличается HTML и XML
- 69. Что такое CRUD
- 70. Какой паттерн программирования реализует Django
- 71. На каком этапе в приложении Django происходит запрос к базе данных
- 72. Какой результат будет Post.objects.all() и какого типа вернет
- 73. Что такое SQL
- 74. Каким запросом я могу достать все данные из таблицы
- 75, Что такое многие-ко-многим
- 76. Как реализуется М2М в SQL
- 77. Что такое JOIN и какой он может быть
- 78. Что такое View
- 79. Что такое миксины
- 80. Звёздный синтаксис
- 81. Два способа создания класса
- 82. Чем файл .pyc отличается от .py
- 83. Что делает python объектно-ориентированым
- 84. Как производится отладка программы на Python
- 85. Что такое GIL
- 86. Статусы ответов HTTP
- 87. Что такое Django Middleware
- 88.Как вставить объект чтобы он оказался под определенным индексом?
- 89.Что нужно сделать, чтобы функция возвращала значение? Использовать оператор return или yield
- 90. Что если в функции не будет return, будет ли она что-то возвращать?
- 91. Напишите в одну строку как можно получить самую позднюю по коду букву в строке
- 92. Как конвертировать список в строку?
- 93. Принципы SOLID
- 94. SQL JOIN
- 95. SQL оператор HAVING
- 96. Метаклассы в Python
- 97. Множественное наследование
- 98. Компоненты django
150 вопросов для собеседования на вакансию Python. Часть 1 (без опыта работы)
150 вопросов для собеседования на вакансию Python. Часть 2 (с опытом работы)
50+ ответов на вопросовы с собеседований по Python
80 практических вопросов по Python для собеседования
Разные задачи на Python и решение к ним
- Статическая - типизация, при которой переменная связывается с типом в момент объявления, и тип не может быть изменён позже, динамическая - типизация, при которой тип переменной задается в момент присваивания значения, а не в момент объявления, и т.о. может быть изменен позже.
пример статической типизации (С++):
int x = 5;
x = "abc"; // здесь C++ компилятор будет ругаться
или, что то же самое:
int x;
x = 5;
x = "abc"; // здесь C++ компилятор будет ругаться
пример динамической типизации (Python):
x = 5
x = "a" # здесь интерпретатор не ругается, так как типизация динамическая
- Строгая - отсутствие автоматических кастов в другой тип (неявных преборазований). Нестрогая - наличие таковых.
пример строгой типизации (Python):
a = [5, 6]
print(",".join(a)) # здесь интерпретатор ругается, так как join() ожидает список строк на входе
пример нестрогой типизации (Javascript):
let a = "hello";
let b = 100;
let c = a + b;
console.log(c); // "hello100"
- Явная - указываем типы везде руками. Неявная - компилятор/интерпретатор занимается этим сам.
пример явной типизации (C++):
int x = 5;
y = 6; // здесь компилятор будет ругаться
пример неявной типизации (Python):
a = 1
Важно: наиболее рационально и оптимально память используется в случае строгой статической типизации.
Динамическая, строгая, неявная.
Переменная Python — это идентификатор для ссылки на объект в памяти программы. На один и тот же объект в памяти могут указывать (ссылаться) несколько переменных. Как только на область памяти перестают ссылаться переменные - данная область очищается сборщиком мусора, и т.о. память освобождается за счет подсчитывания ссылок на объекты в памяти.
- int - целые числа.
- float - вещественные или действительные числа(числа с плавающей точкой).
- complex - комплексные числа.
- decimal - десятичные дроби.
Cтрока – это упорядоченная последовательность символов, которая предназначена для хранения информации в виде простого текста. В Python3 строка по умолчнанию имеет кодировку Unicode, что избавляет от проблем работы и отображения символов кирилицы и прочих экзотических кодировок. Строка это неизменяемый тип данных, т.е. если нужно добавить символов в существующую строку, придется создать новую строку, с новым адресом в памяти:
a = "hello"
id(a) # 2044344987401
a = "hello world"
id(a) # 2044334957804
Списки Python схожи с массивами в других языках. Кортеж похож на список, но вы создаете его с круглыми скобками, вместо квадратных. Вы также можете использовать встроенный инструмент для создания кортежей. Разница между списками и кортежами в том, что кортеж неизменяем, в то время как список изменяем. Т.е. в список можно добавить элемент и его адрес в памяти не изменится, а если нужно добавить элемент в кортеж, то нужно создать новый кортеж, и у него уже будет новый адрес в памяти:
# список
a = [1,2]
id(a) # 2044364987904
a.append(3)
id(a) # 2044364987904
# кортеж
a = (1,2)
id(a) # 2044370285184
a = (1,2,3)
id(a) # 2044369999872
Важно: кортеж занимает меньше места в памяти чем список, и поэтому всегда, когда массив объектов заведомо неизменяем, рекомендуется использовать кортежи, вместо списков.
Словари в Python - коллекции произвольных объектов с доступом по ключу. Начиная с Python3.6 словарь dict() упорядочен, т.е. при переборе имеющегося словаря, элементы возвращаются в том порядке, в котором они были добавлены в словарь при его наполнении. До Python3.6 приходилось использовать объект OrderedDict(), чтобы иметь упорядоченную коллекцию, с доступам к элементам по ключам. Словарь это изменяемый тип данных.
- Массивы
- Стеки
- Кучи
- Очереди
- Связанные списки
- Графы
- Деревья
- Хэш таблицы
- Map
Распределённая система управления версиями. Разработан Линусом Торвальдсом, для удобной разработки ядра Linux.
git init
Отправка всех неотправленных локальных коммитов на удалённый сервер репозитория.
Фиксирует изменения локальных файлов в таймлайне репозитория. Другими словами делает "моментальный снимок" репозитория в данный момент времени, который и является версией.
git merge
- принимает содержимое ветки источника и объединяет их с целевой веткой. В этом процессе изменяется только целевая ветка. История исходных веток остается неизменной.
git rebase
— еще один способ перенести изменения из одной ветки в другую. Rebase сжимает все изменения в один «патч». Затем он интегрирует патч в целевую ветку.
В отличие от слияния, перемещение перезаписывает историю, потому что она передает завершенную работу из одной ветки в другую. В процессе устраняется нежелательная история.
Виртуальное окружение (virtualenv) — это инструмент для создания отдельного пространства для проекта с его зависимостями и библиотеками в директории проекта.
pip install virtualenv
python -m venv namevenv
- Форматирование f-строками.
- Форматирование методом str.format().
- Форматирование оператором '%'.
item[START:STOP:STEP]
Функция Python slice() возвращает нарезанный объект из набора индексов ввода, указанного пользователем в соответствии с переданными ему аргументами. Объект должен быть iterable.
Переход к следующему объекту в коллекции, например список, кортеж и т.д. Сам по себе объект коллекции должен быть iterable.
while
и for
.
For используется только тогда, когда необходимо совершить перебор элементов заранее известное число раз. Цикл while также используется для повторения частей кода, но вместо зацикливания на n количество раз, он выполняет работу до тех пор, пока не достигнет определенного условия. Выйти из цикла в любой момент можно используя ключевое слово break
, а перейти на следующую итерацию цикла можно используя слово continue
.
if-elif-else
Для получения информации с клавиатуры в Python есть функция input()
.
- Преобразование типов - это преобразование объекта из одного типа данных в другой тип данных.
- Неявное преобразование типов автоматически выполняется интерпретатором Python.
- Python позволяет избежать потери данных в неявном преобразовании типов.
- Явное преобразование типов также называется приведением типов, типы данных объекта преобразуются с использованием предопределенной функции.
- При приведении типов может произойти потеря данных, поскольку мы приводим объект к определенному типу данных.
В простейшем случае аннотация содержит непосредственно ожидаемый тип. Аннотации для переменных пишут через двоеточие после идентификатора. После этого может идти инициализация значения. Например price: int = 5
Параметры функции аннотируются так же как переменные, а возвращаемое значение указывается после стрелки ->
и до завершающего двоеточия. Например
def indent_right(s: str, width: int) -> str:
.
Важно: аннотация типов не есть то же самое, что статическая типизация.
Да.
PEP - Python Enhancement Proposals - база всех предложений как улучшить Python и что изменить. Например PEP8 - это общепринятое руководство по написанию кода на Python.
Функция range()
возвращает объект с интерфейсом итератора, выдающий элементы из диапазона, определяемого аргументами функции range(старт, стоп, шаг), при этом не храня все элементы в памяти.
Если начальное значение счётчика enumerate()
не передаётся — оно, по умолчанию, устанавливается в 0. Функция создаёт объект, генерирующий кортежи, состоящие из индекса элемента и самого этого элемента.
- list.append(x) Добавляет элемент в конец списка
- list.extend(L) Расширяет список list, добавляя в конец все элементы списка L
- list.insert(i, x) Вставляет на i-ый элемент значение x
- list.remove(x) Удаляет первый элемент в списке, имеющий значение x. ValueError, если такого элемента не существует
- list.pop([i]) Удаляет i-ый элемент и возвращает его. Если индекс не указан, удаляется последний элемент
- list.index(x, [start [, end]]) Возвращает положение первого элемента со значением x (при этом поиск ведется от start до end)
- list.count(x) Возвращает количество элементов со значением x
- list.sort([key=функция]) Сортирует список на основе функции
- list.reverse() Разворачивает список
- list.copy() Поверхностная копия списка
- list.clear() Очищает список
В python всё является объектом, кроме ключевых слов: in, is, if, while, и т.д.
Имя переменной может состоять только из цифр, букв и знаков подчеркивания. Имя переменной может начинаться только с буквы или с нижнего подчеркивания. Никаких чисел в начале имени переменной быть не должно. Имя переменной не может содержать ключевые слова (зарезервированные) языка Python. Принято разделять слова нижним подчеркиванием (snake case).
Литерал в Python – это простейший способ создания объектов. Если в тексте программы встречается литерал, то для этого литерала создается отдельный объект некоторого типа, соответствующего содержанию литерала:
"Hello" # строковый литерал
1123 # целочисленный литерал
[1,2] # списковый литерал
Чтобы конвертировать число в строку, используйте встроенную функцию str()
.
Разбивает строку на части, используя специальный разделитель, и возвращает эти части в виде списка
str.split([разделитель [, maxsplit]])
.
Метод "str".join(["Hello", "world"])
возвращает строку, которая является конкатенацией (объединением) всех элементов строк итерируемого объекта iterable. В итоговой строке элементы объединяются между собой при помощи строки-разделителя str. Элементы итерируемого объекта должны быть строками (ну или как минимум иметь реализованный магический метод __str__()
).
Используя ключевое слово “import”, например import random
Использование псевдонимов — as. Некоторые модули имеют длинное и неудобное название. Для удобства и сокращения количества кода программист может заменить его на своё.
Для импорта конкретных объектов используют конструкцию from ... import ...
.
from module_name import *
import module_name
Ограничено объемом оперативной памяти.
Ключом может являться в принципе любой неизменяемый тип данных.
Функция id()
возвращает уникальный идентификатор для указанного объекта. По сути этот идентификатор однозначно опредедяет адрес объекта в памяти интерпретатора.
В консоли прописать python --version
Огромное количество отличий. Самые значимые/ключевые:
- строки в Python3 по умолчанию в кодировке Unicode
- в Python3 теперь range вместо xrange
- в словарях в Python3 теперь нет некоторых методов
- в Python3 появилась возможность распаковывать переменных через оператор
*
-....
Подробнее здесь.
Оператор break
досрочно прерывает цикл.
Оператор continue
начинает следующий проход цикла, минуя оставшееся тело цикла (for или while).
True
C++
Python - интерпретируемый язык программирования. Он не конвертирует свой код в машинный, который понимает железо (в отличие от С и С++). Процесс такой вот конвертации называется компилляцией. Вместо этого, Python-интерпретатор, а точнее говоря его стандартная реализация CPython, переводит код программы в байт-код, который запускается на виртуальной машине Python (PVM). Есть реализация интерпретатора Python, которая работает через JIT (just in time) компилляцию - Pypy.
- Называть свои модули так, чтобы имена не совпадали с именами сторонних/стандартных библиотек, которые также используются в коде
- Ипользовать
as
при импорте, чтобы заменять названия импортируемых модулей
%s
Строка %d
Десятичное число.
Класс — тип, описывающий устройство объектов. Другими словами, это описание сущности, у которой есть определенный набор свойств и методов.
Возможность одному классу выступать в качестве наследника для другого, перенимая тем самым его свойства и методы. Ключевой момент наследования - это то, что класс наследник может не только использовать методы и свойства родительского класса, но и переопределить их, а также добавить новые свойства и методы.
Ограничение доступа к составляющим объект компонентам (методам и свойствам). Инкапсуляция делает некоторые из компонент доступными только внутри класса.
Разное поведение одного и того же метода в разных классах.
Неограниченное количество.
Один из способов реализации полиморфизма, заключающийся в возможности одновременного существования в одной области видимости нескольких различных вариантов применения оператора, имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются. Перегрузка операторов не поддерживается в Python.
Пример из C++, где поддерживается перегрузка операторов:
float getArea(float a, float b) // функция, вычисляющая площадь прямоугольника с длиной a и высотой b
{
return a * b;
}
float getArea(float r) // функция, вычисляющая площадь круга с радиусом r
{
return pi * r * r;
}
float S1 = getArea(5.0, 6.0); // 30
float S3 = getArea(5.0); // 78.5
Это специальные методы в python, обрамленные двумя нижними подчеркиваниями
- Инициализация объекта:
__init__
- Строковые представления:
__repr__
,__str__
- Итерация:
__iter__
,__next__
и другие
Есть три типа модификаторов доступов в Python ООП:
- публичный
public
- приватный
__private
- защищенный
_protected
Важно: в Python нету жесткой инкапсуляции, т.е. даже к приватному методу можно получить доступ снаружи класса. Инкапсуляция в Python это больше договорянность между разработчиками, чем жесткое сокрытие, как например в C++ или Java.
Это функция, которая будучи вызванной в функции next() возвращает следующий объект согласно алгоритму ее работы. Вместо ключевого слова return в генераторе используется yield. Главное отличие yield от return это то, что yield, после возврата объекта, сохраняет стек генератора, так что при следующем вызове функции next() от генератора, исполнение кода генератора продолжится с того момента, где yield вернул объект в прошлый раз.
С помощью символа #
. Так же есть такое понятие как docstring задать его можно с помощью тройных кавычек.
С помощью среза [::-1]
или встроенной функции reversed()
.
В python такой цикл не реализован. Это вопрос из тех, которые с подвохом, когда упоминают элементы других языков.
Для этого можно конвертировать список во множество set()
.
- Оператор // выполняет целочисленное деление и возвращает целую часть числа, полученного в результате операции:
7 // 2 = 3
- Оператор ** возводит в степень:
2**10 = 1024
- Оператор % возвращает результат деления по модулю, то есть остаток после деления:
13 % 7 = 6
Для этого вызываем функцию len()
.
Генераторы позволяют создавать списки с помощью одной строки кода
>>> [i for i in range(1, 11, 2)]
[1, 3, 5, 7, 9]
HyperText Transfer Protocol — «протокол передачи гипертекста». По умолчанию использует для работы TCP порт 80.
JSON - текстовый формат обмена данными, основанный на JavaScript - JavaScript Object Notation. XML - в переводе с англ eXtensible Markup Language — расширяемый язык разметки. Используется для хранения и передачи данных.
Разница: HTML - это язык разметки, который используется для разработки веб-страниц. Его основная цель - отображение данных с акцентом на их внешний вид. XML - это язык разметки, основной целью которого является транспортировка и хранение данных.
Терамин обозначающий четыре базовые функции: создание (create), чтение (read), редактирование (update) и удаление (delete). Как правило термин "CRUD" употребляется в контексте работы с хранилищем данных.
Фреймворк Django реализует архитектурный паттерн Model-View-Template.
В DRF Request-Process-Response.
QuerySet может быть создан, отфильтрован, ограничен и использован фактически без выполнения запросов к базе данных. База данных не будет затронута, пока вы не спровоцируете выполнение QuerySet.
Объект класса QuerySet.
SQL или Structured Query Language (язык структурированных запросов) — язык программирования, предназначенный для управления данными в СУБД.
SELECT * FROM nametable
Связь многие ко многим описывает ситуацию, когда объект первой модели может одновременно ассоциироваться с несколькими объектами второй модели. И наоборот, один объект второй модели может также одновременно быть ассоциирован с несколькими объектами первой модели. Например, один студент может посещать несколько курсов, а один курс могут посещать несколько студентов.
Связь многие ко многим подразумевает, что записи в одной таблице могут иметь множество ссылок на другую таблицу и наоборот. Когда есть такой тип связи нужно создавать дополнительную таблицу, которая сведет связь многие ко многим до связи один ко многим.
- INNER JOIN (CROSS JOIN) - внутреннее (перекрёстное) объединение.
- LEFT JOIN - левостороннее внешнее объединение.
- RIGHT JOIN - правостороннее внешнее объединение.
- FULL OUTER JOIN (FULL JOIN) - полное объединение
Views отвечают за обработку и передачу данных и могут реализовывать одну или несколько функций. В Django используются два вида представлений:
- Представления-функции (view functions),
- Представления-классы (class based views).
Mixin представляет собой набор свойств и методов, которые могут быть использованы в различных классах, которые не приходят из базового класса.
-
- и ** для передачи аргументов в функцию;
-
- и ** для сбора переданных в функцию аргументов;
- ** для принятия только именованных аргументов;
-
- при распаковке кортежей;
-
- для распаковки итерируемых объектов в список/кортеж;
- ** для распаковки словарей в другие словари.
Класс type() с тремя аргументами вернет объект нового типа. Это по сути динамическая форма инструкции class, ее еще называют метакласс.
type(class_name, super_classes, attributes_dict)
.pyc
содержат скомпилированный байт-код исходных файлов Python
Он следует парадигме объектно-ориентированного программирования, которая построена вокруг классов (classes) и их экземпляров (instances). Это позволяет реализовать следующие функции:
- сокрытие внутренней структуры данных
- абстракция
- наследование
- полиморфизм (способность выбирать правильный метод в зависимости от типа данных)
- ограничение доступа к данным.
Использовать IDE с поддержкой дебага либо использовать модуль pdb
import pdb; pdb.set_trace()
Глобальная блокировка интерпретатора CPython. Это механизм, который не позволяет нескольким потокам выполнить один и тот же байткод. Другими словами, благодаря GIL, в каждый момент времени в контексте одного процесса Python исполняется только один поток (Thread), все остальные ждут своей очереди на исполнение. Именно поэтому многопоточность не ускоряет обработку данных в разных потоках, так как по факту все обрабатывается последовательно.
Коды сгруппированы в 5 классов:
- Информационные 100 - 199
- Успешные 200 - 299
- Перенаправления 300 - 399
- Клиентские ошибки 400 - 499
- Серверные ошибки 500 – 599
Подробнее https://developer.mozilla.org/ru/docs/Web/HTTP/Status
Django Middleware (middleware в переводе "промежуточный слой") – это промежуточный слой между запросом (request) и ответом (response). В Django по умолчанию содержатся наиболее важные и нужные middleware. Например, AuthenticationMiddleware, ассоциирует пользователей с запросами с помощью сессий. Можно написать свой middleware: например хорошим вариантом может быть middleware для отлавливания и логгирования всех тех исключений которые не были отловлены на более низких уровнях.
Сначала создадим список:
>>> a=[1, 2, 4]
Затем используем метод insert()
. В нем первым аргументом будет индекс, под которым вставляется объект, а вторым — значение объекта:
>>> a.insert(2,3)
>>> a
[1, 2, 3, 4]
Использовать оператор return
или yield
Функция может и не заканчиваться инструкцией return
, при этом функция вернет значение None
Строковый метод max()
будет сравнивать значение ASCII каждого символа в строке и возвращает максимальный алфавитный символ.
>>> str = "Wow! This is string!"
>>> max(str)
'w'
Мы могли бы использовать метод str.join()
для преобразования списка, который имеет элементы типа данных str
в строку.
Например,
>>> a = ["a", "b", "c"]
>>> "".join(a)
'abc'
Метод join объединяет любое количество строк, строка, метод которой вызывается, вставляется между каждой заданной строкой. Как показано в примере, между элементами списка вставляется строка "", пустая строка.
Метод join
требует в качестве заданных параметров тип данных str
. Поэтому, если вы попытаетесь присоединиться к списку типов int, вы получите TypeError
.
Перед соединением тип int
должен быть преобразован в тип str
.
>>> a = [1,2,3]
>>> "".join([str(_) for _ in a])
"123"
или при помощи функции map
:
>>> a = [1,2,3]
>>> "".join(map(str, a))
'123'
S – Single Responsibility (Принцип единственной ответственности)
Каждый класс должен отвечать только за одну операцию.
O — Open-Closed (Принцип открытости-закрытости)
Классы должны быть открыты для расширения, но закрыты для модификации.
L — Liskov Substitution (Принцип подстановки Барбары Лисков)
Если П является подтипом Т, то любые объекты типа Т, присутствующие в программе, могут заменяться объектами типа П без негативных последствий для функциональности программы.
I — Interface Segregation (Принцип разделения интерфейсов)
Не следует ставить клиент в зависимость от методов, которые он не использует.
D — Dependency Inversion (Принцип инверсии зависимостей)
Модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
INNER JOIN Возвращает записи которые имеют соответствие в обеих таблицах
OUTER LEFT JOIN Возвращает все записи из левой таблицы + записи которые имеют соответствие из правой
OUTER RIGHT JOIN Возвращает все записи из правой таблицы + записи которые имеют соответствие из левой
OUTER FULL JOIN Возвращает все записи из обеих таблиц
SQL оператор HAVING используется в сочетании с оператором GROUP BY, чтобы ограничить группы возвращаемых строк только теми, чьё условие TRUE.
Метакласс это «штука», которая создаёт классы.
Мы создаём класс для того, чтобы создавать объекты, так? А классы являются объектами. Метакласс это то, что создаёт эти самые объекты. Они являются классами классов, можно представить это себе следующим образом:
MyClass = MetaClass()
MyObject = MyClass()
Мы уже видели, что type позволяет делать что-то в таком духе:
MyClass = type('MyClass', (), {})
Это потому что функция type на самом деле является метаклассом. type это метакласс, который Питон внутренне использует для создания всех классов.
class Class1: # Базовый класс для класса Class2
def f_func1(self):
print "Метод f_func1() класса Class1"
class Class2(Class1): # Класс Class2 наследует класс Class1
def f_func2(self):
print "Метод f_func2() класса Class2"
class Class3(Class1): # Класс Class3 наследует класс Class1
def f_func1(self):
print "Метод f_func1() класса Class3"
def f_func2(self):
print "Метод f_func2() класса Class3"
def f_func3(self):
print "Метод f_func3() класса Class3"
def f_func4(self):
print "Метод f_func4() класса Class3"
class Class4(Class2, Class3): # Множественное наследование
def f_func4(self):
print "Метод f_func4() класса Class4"
c1 = Class4() # Создаем экземпляр класса Class4
c1.f_func1() # Выведет: Метод f_func1() класса Class1
c1.f_func2() # Выведет: Метод f_func2() класса Class2
c1.f_func3() # Выведет: Метод f_func3() класса Class3
c1.f_func4() # Выведет: Метод f_func4() класса Class4