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


class MyDict(dict):

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


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

Multiple Dispatch

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


Design by contract

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