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
это объект, владеющий дескриптором