print "Hello, world"print ("Hello, world")range - возвращает список; xrange - возвращает итераторrange, и она возвращает итератор
Так как в Питоне 3 различий между строкой и юникодом больше нет, __unicode__ исчез, а появился __bytes__ (который ведёт себя так же как __str__ и __unicode__ в 2.7) для новых встроенных функций построения байтовых массивов.
Так как деление в Питоне 3 теперь по-умолчанию «правильное деление», __div__ больше нет.
__coerce__ больше нет, из-за избыточности и странного поведения.
__cmp__ больше нет, из-за избыточности.
__nonzero__ было переименовано в __bool__ .
next у итераторов был переименован в __next__ .
S - Принцип единственной ответственности (single responsibility principle)
Для каждого класса должно быть определено единственное назначение. Не должно возникать God object, который занимается всем в программе.
O - Принцип открытости/закрытости (open–closed principle)
«программные сущности … должны быть открыты для расширения, но закрыты для модификации». Мы должны иметь возможность добавлять функциональность.
L - Принцип подстановки Барбары Лисков (Liskov substitution principle)
«объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы». У объекта есть тип, но сами классы выстраиваются в иерархию классов. Подтип типа всю старую функциональность должен выполнять.
I - Принцип разделения интерфейса (interface segregation principle)
«много интерфейсов, специально предназначенных для клиентов, лучше, чем один интерфейс общего назначения». Интерфейс - способ провзаимодействовать с какой-то программной действующей функцией.
D - Принцип инверсии зависимостей (dependency inversion principle) «Зависимость на Абстракциях. Нет зависимости на что-то конкретное».
class C:
pass
имя_объекта = имя_класса()
У класса может не быть тела.
Простейший пример класса:
class Rectangle:
default_color = "green" # статический атрибут
def __init__(self, width, height): # конструктор класса
self.width = width # динамический атрибут
self.height = height # динамический атрибут
В python нет возможности сделать несколько конструкторов.
class FileObject:
def __init__(self, filepath='~', filename='sample.txt'): # Обёртка для файлового объекта, чтобы быть уверенным в том, что файл будет закрыт при удалении.
self.file = open(join(filepath, filename), 'r+') # Открыть файл filename в filepath в режиме чтения и записи
def __del__(self):
self.file.close()
del self.file
Метод, который будет вызван при инициализации объекта.
Это первый метод, который будет вызван при инициализации объекта. Он принимает в качестве параметров класс и потом любые другие аргументы, которые будут переданы в __init__ . __new__ используется весьма редко, но иногда бывает полезен, в частности, когда класс наследуется от неизменяемого (immutable) типа, такого как кортеж (tuple) или строка.
__new__(cls, [...])
Инициализатор класса. Самый базовый магический метод, __init__ . С его помощью мы можем инициализировать объект.
__init__(self, [...])
Деструктор объекта
__del__
Самый базовый из методов сравнения __cmp__(self, other) . Он, в действительности, определяет поведение для
всех операторов сравнения (>, ==, !=, итд.), но не всегда так, как вам это нужно (например, если эквивалентность
двух экземпляров определяется по одному критерию, а то что один больше другого по какому-нибудь другому).
__cmp__ должен вернуть отрицательное число, если self < other , ноль, если self == other , и положительное число
в случае self > other . Но, обычно, лучше определить каждое сравнение, которое вам нужно, чем определять их всех
в __cmp__ . Но __cmp__ может быть хорошим способом избежать повторений и увеличить ясность, когда все необходимые
сравнения оперируют одним критерием.
__eq__(self, other) Определяет поведение оператора равенства, ==__ne__(self, other) Определяет поведение оператора неравенства, !=__lt__(self, other) Определяет поведение оператора меньше, <__gt__(self, other) Определяет поведение оператора больше, >__le__(self, other) Определяет поведение оператора меньше или равно, <=__ge__(self, other) Определяет поведение оператора больше или равно, >=__pos__(self) Определяет поведение для унарного плюса (+some_object)
__neg__(self) Определяет поведение для отрицания(-some_object)
__abs__(self) Определяет поведение для встроенной функции abs().
__invert__(self) Определяет поведение для инвертирования оператором ~. Для объяснения что он делает смотри статью в Википедии о бинарных операторах.
__round__(self, n) Определяет поведение для встроенной функции round(). n это число знаков после запятой, до которого округлить.
__floor__(self) Определяет поведение для math.floor(), то есть, округления до ближайшего меньшего целого.
__ceil__(self) Определяет поведение для math.ceil(), то есть, округления до ближайшего большего целого.
__trunc__(self) Определяет поведение для math.trunc(), то есть, обрезания до целого.
__add__(self, other) Сложение.
__sub__(self, other) Вычитание.
__mul__(self, other) Умножение.
__floordiv__(self, other) Целочисленное деление, оператор //.
__div__(self, other) Деление, оператор /.
__truediv__(self, other) Правильное деление. Заметьте, что это работает только когда используется from __future__ import division.
__mod__(self, other) Остаток от деления, оператор %.
__divmod__(self, other) Определяет поведение для встроенной функции divmod().
__pow__ Возведение в степень, оператор **.
__lshift__(self, other) Двоичный сдвиг влево, оператор <<.
__rshift__(self, other) Двоичный сдвиг вправо, оператор >>.
__and__(self, other) Двоичное И, оператор &.
__or__(self, other) Двоичное ИЛИ, оператор |.
__xor__(self, other) Двоичный xor, оператор ^.
__int__(self) Преобразование типа в int.
__long__(self) Преобразование типа в long.
__float__(self) Преобразование типа в float.
__complex__(self) Преобразование типа в комплексное число.
__oct__(self) Преобразование типа в восьмеричное число.
__hex__(self) Преобразование типа в шестнадцатеричное число.
__index__(self) Преобразование типа к int,
когда объект используется в срезах (выражения вида [start:stop:step]). Если вы определяете
свой числовой тип, который может использоваться как индекс списка, вы должны определить
__index__.
__trunc__(self) Вызывается при
math.trunc(self). Должен вернуть своё значение, обрезанное до целочисленного типа
(обычно long).
__coerce__(self, other) Метод для реализации арифметики с операндами разных типов.
__coerce__ должен вернуть None если преобразование типов невозможно.
Если преобразование возможно, он должен вернуть пару (кортеж из 2-х элементов) из
self и other, преобразованные к одному типу.
__str__(self) Определяет поведение функции
str(), вызванной для экземпляра вашего класса.
__repr__(self) Определяет поведение функции
repr(), вызванной для экземпляра вашего класса.
Главное отличие от str() в целевой аудитории.
repr() больше предназначен для машинно-ориентированного
вывода (более того, это часто должен быть валидный код на Питоне), а
str() предназначен для чтения людьми.
__unicode__(self) Определяет поведение функции
unicode(), вызванной для экземпляра вашего класса.
unicode() похож на str(),
но возвращает строку в юникоде. Если клиент вызывает str() на \
экземпляре вашего класса, а вы определили только __unicode__(),
то это не будет работать. Постарайтесь всегда определять __str__()
для случая, когда кто-то не имеет такой роскоши как юникод.
__format__(self, formatstr) Определяет поведение, когда экземпляр вашего
класса используется в форматировании строк нового стиля. Например, "Hello, {0:abc}!
".format(a) приведёт к вызову a.__format__("abc"). Это может быть полезно
для определения ваших собственных числовых или строковых типов, которым вы можете захотеть предоставить
какие-нибудь специальные опции форматирования.
__hash__(self) Определяет поведение функции
hash(), вызванной для экземпляра вашего класса. Метод должен возвращать
целочисленное значение, которое будет использоваться для быстрого сравнения ключей в словарях.
Заметьте, что в таком случае обычно нужно определять и __eq__ тоже.
Руководствуйтесь следующим правилом: a == b подразумевает hash(a) == hash(b).
__nonzero__(self) Определяет поведение функции
bool(), вызванной для экземпляра вашего класса. Должна вернуть
True или False, в зависимости от того,
когда вы считаете экземпляр соответствующим True или False.
__dir__(self) Определяет поведение функции
dir(), вызванной на экземпляре вашего класса. Этот метод должен возвращать
пользователю список атрибутов. Обычно, определение __dir__ не требуется, но может
быть жизненно важно для интерактивного использования вашего класса, если вы переопределили
__getattr__ или __getattribute__.
__sizeof__(self) Определяет поведение функции
sys.getsizeof(), вызванной на экземпляре вашего класса. Метод должен вернуть
размер вашего объекта в байтах.
__len__(self) Возвращает количество элементов в контейнере. Часть протоколов для
изменяемого и неизменяемого контейнеров.
__getitem__(self, key) Определяет поведение при доступе к элементу, используя
синтаксис self[key]. Тоже относится и к протоколу изменяемых и к протоколу
неизменяемых контейнеров. Должен выбрасывать соответствующие исключения: TypeError
если неправильный тип ключа и KeyError если ключу не соответствует никакого значения.
__setitem__(self, key, value) Определяет поведение при присваивании значения элементу,
используя синтаксис self[nkey] = value. Часть протокола изменяемого контейнера.
Опять же, вы должны выбрасывать KeyError и TypeError в соответствующих случаях.
__delitem__(self, key) Определяет поведение при удалении элемента (то есть
del self[key]). Это часть только протокола для изменяемого контейнера.
Вы должны выбрасывать соответствующее исключение, если ключ некорректен.
__iter__(self) Должен вернуть итератор для контейнера.
Итераторы возвращаются в множестве ситуаций, главным образом для встроенной функции iter()
и в случае перебора элементов контейнера выражением for x in container:.
Итераторы сами по себе объекты и они тоже должны определять метод
__iter__, который возвращает self.
__reversed__(self) Вызывается чтобы определить поведения для встроенной функции
reversed(). Должен вернуть обратную версию последовательности. Реализуйте метод
только если класс упорядоченный, как список или кортеж.
__contains__(self, item) __contains__
предназначен для проверки принадлежности элемента с помощью in и
not in. Вы спросите, почему же это не часть протокола последовательности?
Потому что когда __contains__ не определён, Питон просто перебирает всю
последовательность элемент за элементом и возвращает True если находит нужный.
__missing__(self, key) __missing__
используется при наследовании от dict . Определяет поведение для для каждого
случая, когда пытаются получить элемент по несуществующему ключу (так, например, если у меня есть словарь d и я пишу
d["george"] когда "george" не является ключом в словаре, вызывается d.
__missing__("george")).
__get__, __set__ или __delete__.
__get__(self, instance, instance_class) Определяет поведение при возвращении значения из
дескриптора. instance это объект, для чьего атрибута-дескриптора вызывается метод. owner это тип (класс) объекта.
__set__(self, instance, value) Определяет поведение при изменении значения из дескриптора.
instance это объект, для чьего атрибута-дескриптора вызывается метод.
value это значение для установки в дескриптор.
__delete__(self, instance) Определяет поведение для удаления значения из дескриптора.
instance это объект, владеющий дескриптором