Домой

Последняя активность

  

ООП в Python

PyDeKolt avatar PyDeKolt (0) [#] (27.05.2013 / 16:44)
Объектно-ориентированное программирование Python.
  1. class MyClass(object):
  2. pass
  3. x = MyClass()
  4. x.__setattr__('counter', 5) # создать аттрибут counter и присвоить ему значение
  5. 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 существуют оссобенности при наследовании классов. А имеенно нельзя наследовать класс, который уже наследует один из базовых классов.
  1. class X(object): pass
  2. class Y(X): pass
  3. class Z(X,Y): pass # TypeError класс Y уже содержит базовый класс X
  4. class RedBaseClass(object):
  5. title = 'Title RedBaseClass'
  6. class GreenBaseClass(object):
  7. title = 'Title GreenBaseClass'
  8. def green(self):
  9. self.title = GreenBaseClass.title
  10. class MyClass(RedClass, GreenBaseClass): # наследуем свойства базовых классов
  11. pass
  12. t = MyClass()
  13. print t.title
  14. # будет использован атрибут title класса RedBaseClass т.к. он первый в списке наследования
  15. # результат: 'Title RedBaseClass'
  16. t.green()
  17. print t.title
  18. # медот green будет не найден в базовом классе RedBaseClass, поэтому поиск продолжется в классе GreenBaseClass, где он будет найден и запущен
  19. # результат: 'Title GreenBaseClass'


Словари пространства имён
  1. class MyClass(object):
  2. def __init__(self):
  3. self.a = 1
  4. self.b = 2
  5. self.c = 3
  6. x = MyClass()
  7. print x.__dict__ # доступ к словарю пространства имен объекта
  8. # {'a': 1, 'c': 3, 'b': 2}
  9. class OneBaseClass(object):
  10. pass
  11. class TwoBaseClass(object):
  12. pass
  13. class MyClass(OneBaseClass, TwoBaseClass):
  14. pass
  15. x = MyClass()
  16. print x.__class__ # сослаться на свой собственный класс
  17. #
  18. print x.__class__.__name__ # получить имя своего класса
  19. # MyClass
  20. print x.__class__.__bases__ # получит кортеж из базовых классов
  21. # (, )


Приватные атрибуты класса

В Python существует механизм позволяющий скрывать атрибуты класса доступ к которым напрямую нежелателен. Достаточно лишь добавить к имени атрибута два знака подчеркивания.

Однако получить доступ к этому атрибуту все же можно. Используя шаблон
  1. ClassName._ClassName__AttrName
  2. class Color(object):
  3. def __init__(self, name):
  4. self.__name = name
  5. def name(self):
  6. return self.__name
  7. c = Color('Red')
  8. print c.name() # Red
  9. print c._Color__name # Red
  10. print c.__name # AttributeError: 'Color' object has no attribute '__name'


+ Проверка принадлежности к классу в Python
+ Свойства класса через @property
+ Абстрактные базовые классы в Python
+ Метаклассы в Python
+ Декораторы классов в Python
* Python для чайников
  Всего: 1

Зарегистрируйтесь и сможете комментировать все темы. Кнопочка вверху
Фильтр по автору
Скачать тему

В Форум

Новые вверху
waplog Рейтинг@Mail.ru
Statok.nettop-sid.ru
Яндекс.Метрика