15. Примери с мета класове

15. Примери с мета класове

15. Примери с мета класове

22 април 2013

Метакласове

Забележка

В Пайтън type значи няколко неща

Типът на типовете

Класовете са просто инстанции на type.

type(name, bases, dict)

Начини да направим клас

Foo = type('Foo', (A, B, C), {'x':1, 'y':2})

Долното е синтактична захар за горното...

class Foo(A, B, C):
    x = 1
    y = 2

Мета

class metacls(type):
     def __new__(mcs, name, bases, dict):
         dict['foo'] = 'metacls was here'
         return type.__new__(mcs, name, bases, dict)

Foo = metacls('Foo', (A, B, C), {'x':1, 'y':2})
type(Foo) # metacls

Мета със захар

class Foo(A, B, C, metaclass=metacls):
    x = 1
    y = 2

Tim Peters on metaclasses

[Metaclasses] are deeper magic than 99% of the users should ever worry about. If you wonder whether you need them, you don't (the people who actually need them know with certainty that they need them, and don't need an explanation about why).

— Tim Peters

__prepare__

class MyDict(dict):
  pass

class Foo(type):
  @classmethod
  def __prepare__(self, name, bases):
      return MyDict()

__annotate__

def foo(x: int, y: string):
  pass

Multiple Dispatch

Кодът, който разглеждахме през първия час можете да намерите тук:

http://pythonmulti.codeplex.com/releases/view/43090

Design by contract

Кодът, който разглеждахме през втория час можете да намерите тук:

http://pythondbc.codeplex.com/releases/view/42938

Въпроси?