- class MyClass(object):
- pass
- x = MyClass()
- x.__setattr__('counter', 5) # создать аттрибут counter и присвоить ему значение
- print x.counter # получит значение аттрибута counter
Общие методы перезагрузки операторов
Метод | Перезагружает | Вызывается
__init__ | Конструктор | При создании объекта: X = Class()
__del__ | Деструктор | При уничтожении объекта
__add__ | Оператор + | X + Y, X+= Y
__or__ | Оператор | (побитовое ИЛИ) | X | Y, X | = Y
__repr__, __str__ | Вывод, преобразование | print X, repr(X), str(X)
__call__ | Вызовы функций | X()
__getattr__ | Обращение к атрибуту | X.undefined
__setattr__ | Присваивание атрибутам | X.any = value
__getitem__ | Доступ к элементу по индексу | X[key], циклы for и другие конструкции итерации, при отсутствии метода __iter__
__setitem__ | Присваивание элементу по индексу | X[key] = value
__len__ | Длина | len(X), проверка истинности
__cmp__ | Сравнение | X == Y, X < Y
__lt__ | Специальное сравнение | X < Y (в ином случае __cmp__)
__eq__ | Специальное сравнение | X == Y (в ином случае __cmp__)
__radd__ | Правосторонний оператор + | Не_экземпляр + X
__iadd__ | Добавление (увеличение) | X += Y (в ином случае __add__)
__iter__ | Итерационный контекст | Циклы for, оператор in, генераторы списков, map и другие
Множественное наследование
Порядок поиска базовых классов происходить слева направо от порядка их следования. Однако алгоритм наследования гораздо сложнее чем кажется и узнать настоящий порядок наследования классов можно вызовом метода класса MyClass.__mro__
В Python существуют оссобенности при наследовании классов. А имеенно нельзя наследовать класс, который уже наследует один из базовых классов.
- class X(object): pass
- class Y(X): pass
- class Z(X,Y): pass # TypeError класс Y уже содержит базовый класс X
- class RedBaseClass(object):
- title = 'Title RedBaseClass'
- class GreenBaseClass(object):
- title = 'Title GreenBaseClass'
- def green(self):
- self.title = GreenBaseClass.title
- class MyClass(RedClass, GreenBaseClass): # наследуем свойства базовых классов
- pass
- t = MyClass()
- print t.title
- # будет использован атрибут title класса RedBaseClass т.к. он первый в списке наследования
- # результат: 'Title RedBaseClass'
- t.green()
- print t.title
- # медот green будет не найден в базовом классе RedBaseClass, поэтому поиск продолжется в классе GreenBaseClass, где он будет найден и запущен
- # результат: 'Title GreenBaseClass'
Словари пространства имён
- class MyClass(object):
- def __init__(self):
- self.a = 1
- self.b = 2
- self.c = 3
- x = MyClass()
- print x.__dict__ # доступ к словарю пространства имен объекта
- # {'a': 1, 'c': 3, 'b': 2}
- class OneBaseClass(object):
- pass
- class TwoBaseClass(object):
- pass
- class MyClass(OneBaseClass, TwoBaseClass):
- pass
- x = MyClass()
- print x.__class__ # сослаться на свой собственный класс
- #
- print x.__class__.__name__ # получить имя своего класса
- # MyClass
- print x.__class__.__bases__ # получит кортеж из базовых классов
- # (, )
Приватные атрибуты класса
В Python существует механизм позволяющий скрывать атрибуты класса доступ к которым напрямую нежелателен. Достаточно лишь добавить к имени атрибута два знака подчеркивания.
Однако получить доступ к этому атрибуту все же можно. Используя шаблон
- ClassName._ClassName__AttrName
- class Color(object):
- def __init__(self, name):
- self.__name = name
- def name(self):
- return self.__name
- c = Color('Red')
- print c.name() # Red
- print c._Color__name # Red
- print c.__name # AttributeError: 'Color' object has no attribute '__name'
+ Проверка принадлежности к классу в Python
+ Свойства класса через @property
+ Абстрактные базовые классы в Python
+ Метаклассы в Python
+ Декораторы классов в Python
* Python для чайников