2012 10 22_python_lecture07

30
Python. Объекты и Метапрограммирование.

description

 

Transcript of 2012 10 22_python_lecture07

Page 1: 2012 10 22_python_lecture07

Python.    

Объекты  и  Метапрограммирование.  

Page 2: 2012 10 22_python_lecture07

Пользовательские  атрибуты  и  методы  >>> class C(object): ! classattr = "attr on class"! def f(self): ! return "function f"!>>> C.__dict__ !{'classattr': 'attr on class', '__module__': '__main__', ! '__doc__': None, 'f': <function f at 0x008F6B70>} !!!>>> c = C() !>>> print c.__dict__ !{} !>>> c.classattr is C.__dict__['classattr'] !True !>>> c.f is C.__dict__['f'] !False  

Page 3: 2012 10 22_python_lecture07

Атрибут  __dict__  

•  Таблица  ключ-­‐значение  •  Хранит  имена  пользовательских  атрибутов  объекта  

Page 4: 2012 10 22_python_lecture07

Поиск  имен  

•  <объект>.<атрибут>  

1.  Поиск  значения  <атрибут>  в  таблице  <объект>.__dict__  и  во  встроенных  атрибутах  

2.  <объект>.__class__.__dict__  и  во  встроенных  <объект>.__class__    

3.  Поиск  в  объектах  <объект>.__class__.__bases__    

Page 5: 2012 10 22_python_lecture07

   

Примеры  1,  2  

Page 6: 2012 10 22_python_lecture07

Дескрипторы  !a.x = 1 <==> setattr(a, 'x', 1) !del a.x <==> delattr(a, 'x') !a.x <==> getattr(a, 'x') !!•  setaZr  и  delaZr  влияют  и  изменяют  только  сам  объект  

(точнее  a.__dict__)  

Page 7: 2012 10 22_python_lecture07

Интерфейс  дескриптора  

Методы  __get()__  ,  __set()__  и  __delete()__    !class Desc(object):! def __get__(self, obj, cls=None): ! pass ! def __set__(self, obj, val): ! pass ! def __delete__(self, obj): ! pass !

 

Page 8: 2012 10 22_python_lecture07

Слабый  дескриптор  !class Weak(object): ! def __get__(self, obj, cls): ! return "WeakValue" !class A(object): ! a = Weak()!!>>> i = A() !>>> print i.a !WeakValue !!>>> i.a = "New Value"!>>> print i.a !"New Value"  

Page 9: 2012 10 22_python_lecture07

Сильный  дескриптор  >>> class Strong(object): ! def __get__(self, obj, cls): ! return "StrongValue" ! def __set__(self, obj, cls): ! pass!!>>> class A(object): ! a = Weak() !>>> i=A() !>>> print i.a !StrongValue!>>> i.a = "NewValue" !>>> print i.a !StrongValue  

Page 10: 2012 10 22_python_lecture07
Page 11: 2012 10 22_python_lecture07

Классы  

•  Классы  (типы)  —  это  объектные  фабрики.  Их  главная  задача  —  создавать  объекты,  обладающие  определенным  поведением.  

•  Классы  определяют  поведение  объектов  с  помощью  своих  атрибутов  

Page 12: 2012 10 22_python_lecture07

Инстанциирование  объекта  

2  этапа:  сначала  его  создание,  потом  инициализация    def  __new__(cls,  ...)  —  статический  метод,  который  создает  объект  класса  cls.    def  __init__(self,  ...)  —  метод  класса,  который  инициализирует  созданный  объект.  

Page 13: 2012 10 22_python_lecture07

Пример  class A(object): ! pass!!•  Нет  __new__    и  __init__  

>>> object.__dict__['__init__'] !<slot wrapper '__init__' of 'object' objects> !>>> object.__dict__['__new__'] !<built-in method __new__ of type object at 0x82e780>  

Page 14: 2012 10 22_python_lecture07

!a = object.__new__(A) !object.__init__(a)!!

                     Пример  3  

Page 15: 2012 10 22_python_lecture07

Метаклассы  

 Для  класса  (типа),  так  же  как  и  для  обычного  объекта,  существует  класс  (тип),  который  создает  классы  и  определяет  поведение  класса.    По  умолчанию  для  всех  определяемых  классов  метаклассом  является  type.  

Page 16: 2012 10 22_python_lecture07

Создание  объекта-­‐типа  

•  XClass  =  XMetaClass(name,  bases,  aZrs)  

•  class  A:  pass  

>>>  type('A',  (object,),  {})  <class  '__main__.A'>  

Page 17: 2012 10 22_python_lecture07

Пример  class B(A): !... def foo(self): !... 42 !!type('B', (A,), {'foo': lambda self: 42}) !!  

Page 18: 2012 10 22_python_lecture07

type  

•  type(a)  —  вызов  с  одним  аргументом,  возвращает  тип  объекта,  

•  type(name,  bases,  aZrs)  —  вызов  с  тремя  аргументами  —  это  вызов  конструктора  класса.  

Page 19: 2012 10 22_python_lecture07

Задание  метакласса  

class A(object): ! __metaclass__ = Meta  

Page 20: 2012 10 22_python_lecture07

Курица  или  яйцо  >>> object !<type 'object'> !>>> type !<type 'type'> !>>> type(object) !<type 'type'> !>>> type(type) !<type 'type'> !!!

>>> object.__class__ !<type 'type'> !>>> object.__bases__ !() !>>> type.__class__ !<type 'type'> !>>> type.__bases__ !(<type 'object'>,) !

Page 21: 2012 10 22_python_lecture07

Object  и  type  

Page 22: 2012 10 22_python_lecture07

Объекты-­‐типы  

>>>  isinstance(object,  object)    True    >>>  isinstance(type,  object)    True    

Page 23: 2012 10 22_python_lecture07

Объекты-­‐типы  

•  Могут  представлять  абстрактные  типы  данных  в  программе  

•  Могут  быть  унаследованы  другими  объектами  

•  Можно  создавать  их  экземпляры  •  Типом  любого  объекта-­‐типа  является  <type  'type'>    

•  Тип  ==  класс  

Page 24: 2012 10 22_python_lecture07

Эксперименты  >>> list !<type 'list'> !>>> list.__class__ !<type 'type'> !>>> list.__bases__ !(<type 'object'>,) !>>> tuple.__class__, tuple.__bases__ !(<type 'type'>, (<type 'object'>,)) !!!

>>> dict.__class__, dict.__bases__ !(<type 'type'>, (<type 'object'>,)) !>>> mylist = [1,2,3] !>>> mylist.__class__ !<type 'list'> !

Page 25: 2012 10 22_python_lecture07

List,  tuple,  dict  

Page 26: 2012 10 22_python_lecture07

Пользовательские  типы  class Old: ! pass!>>> old = Old() !>>> type(old) !<type 'instance'> !>>> type(Old) !<type 'classobj'> !>>> issubclass(Old, object) !False  

Page 27: 2012 10 22_python_lecture07

Пользовательские  типы  

class New(object): ! pass!>>> new = New() !>>> type(new) !<class '__main__.New'> !>>> type(New) !<type 'type'>  

Page 28: 2012 10 22_python_lecture07

Отношение  объектов  

Page 29: 2012 10 22_python_lecture07

   

   Пример  4  

Page 30: 2012 10 22_python_lecture07

Применение?  class Person(models.Model): ! name = models.CharField(max_length=30) ! age = models.IntegerField() !!guy = Person(name="Bob", age=35) !print guy.age!!!model.Models определяет __metaclass__