For example:
Python 2.x
- # Here __metaclass__ points to the metaclass object.
- class ExampleClass(object):
- __metaclass__ = type
- pass
- # Here __metaclass__ points to the metaclass object.
- class ExampleClass(metaclass=type):
- pass
- Gets the name of the class.
- Gets the base classes of the class.
- Gets the metaclass of the class. If it is defined, it will use this first. Otherwise, it will check in the base classes for the metaclass. It it can't find a metaclass in the base class, the type object is used instead.
- Gets the variables/attributes in the class and stores them as a dictionary.
- Passes this information to metaclass as metaclass(name_of_class, base_classes, attributes_dictionary) and it returns a class object.
- # type(name, base, attrs)
- # name is the name of the class
- # base is a tuple of base classes (all methods/attributes are inherited
- # from these) attrs is a dictionary filled with the class attributes
- classObject = type('ExampleClass', (object,) ,{})
Python 3.x
- class a:
- def __init__(self, data):
- self.data = data
- def getd3(self):
- return self.data * 3
- class MyMeta(type):
- def __new__(metaname, classname, baseclasses, attrs):
- print('New called with')
- print('metaname', metaname)
- print('classname', classname)
- print('baseclasses', baseclasses)
- print('attrs', attrs)
- attrs['getdata'] = a.__dict__['getd3']
- # attrs['getdata'] = a.getd3
- return type.__new__(metaname, classname, baseclasses, attrs)
- def __init__(classobject, classname, baseclasses, attrs):
- print('init called with')
- print('classobject', classobject)
- print('classname', classname)
- print('baseclasses', baseclasses)
- print('attrs', attrs)
- class Kls(metaclass=MyMeta):
- def __init__(self,data):
- self.data = data
- def printd(self):
- print(self.data)
- ik = Kls('arun')
- ik.printd()
- print(ik.getdata())
- class a(object):
- def __init__(self, data):
- self.data = data
- def getd3(self):
- return self.data * 3
- class MyMeta(type):
- def __new__(metaname, classname, baseclasses, attrs):
- print 'New called with'
- print 'metaname', metaname
- print 'classname', classname
- print 'baseclasses', baseclasses
- print 'attrs', attrs
- attrs['getdata'] = a.__dict__['getd3']
- # attrs['getdata'] = a.getd3
- return type.__new__(metaname, classname, baseclasses, attrs)
- def __init__(classobject, classname, baseclasses, attrs):
- print 'init called with'
- print 'classobject', classobject
- print 'classname', classname
- print 'baseclasses', baseclasses
- print 'attrs', attrs
- class Kls(object):
- __metaclass__ = MyMeta
- def __init__(self, data):
- self.data = data
- def printd(self):
- print self.data
- ik = Kls('arun')
- ik.printd()
- print ik.getdata()
- New called with
- metaname <class '__main__.MyMeta'>
- classname Kls
- baseclasses (<type 'object'>,)
- attrs {'__module__': '__main__', '__metaclass__': <class '__main__.MyMeta'>, 'printd': <function printd at 0x7fbdab0176e0>, '__init__': <function __init__ at 0x7fbdab017668>}
- init called with
- classobject <class '__main__.Kls'>
- classname Kls
- baseclasses (<type 'object'>,)
- attrs {'__module__': '__main__', 'getdata': <function getd3 at 0x7fbdab017500>, '__metaclass__': <class '__main__.MyMeta'>, 'printd': <function printd at 0x7fbdab0176e0>, '__init__': <function __init__ at 0x7fbdab017668>}
- arun
- arunarunarun
Python 3.x
- def meta_func(name, bases, attrs):
- print('meta function called with', name, bases, attrs)
- nattrs = {'mod' + key:attrs[key] for key in attrs}
- return type(name, bases, nattrs)
- MyMeta = meta_func
- class Kls(metaclass=MyMeta):
- def setd(self, data):
- self.data = data
- def getd(self):
- return self.data
- k = Kls()
- k.modsetd('arun')
- print(k.modgetd()
- def meta_func(name, bases, attrs):
- print 'meta function called with', name, bases, attrs
- nattrs = {'mod' + key:attrs[key] for key in attrs}
- return type(name, bases, nattrs)
- MyMeta = meta_func
- class Kls(object):
- __metaclass__ = MyMeta
- def setd(self, data):
- self.data = data
- def getd(self):
- return self.data
- k = Kls()
- k.modsetd('arun')
- print k.modgetd()
- meta function called with Kls (<type 'object'>,) {'setd': <function setd at 0x88b21ec>, 'getd': <function getd at 0x88b22cc>, '__module__': '__main__', '__metaclass__': <function meta_func at 0xb72341b4>}
- arun
Python 3.x
- class MyMeta(type):
- def __call__(clsname, *args):
- print('MyMeta called with')
- print('clsname:', clsname)
- print('args:', args)
- instance = object.__new__(clsname)
- instance.__init__(*args)
- return instance
- class Kls(metaclass=MyMeta):
- def __init__(self, data):
- self.data = data
- def printd(self):
- print(self.data)
- ik = Kls('arun')
- ik.printd()
- class MyMeta(type):
- def __call__(clsname, *args):
- print 'MyMeta called with'
- print 'clsname:', clsname
- print 'args:' ,args
- instance = object.__new__(clsname)
- instance.__init__(*args)
- return instance
- class Kls(object):
- __metaclass__ = MyMeta
- def __init__(self,data):
- self.data = data
- def printd(self):
- print self.data
- ik = Kls('arun')
- ik.printd()
- MyMeta called with
- clsname: <class '__main__.Kls'>
- args: ('arun',)
- arun
- Kls = MetaClass(name, bases, attrs)
Python 3.x
- class SuperMeta(type):
- def __call__(metaname, clsname, baseclasses, attrs):
- print('SuperMeta Called')
- clsob = type.__new__(metaname, clsname, baseclasses, attrs)
- type.__init__(clsob, clsname, baseclasses, attrs)
- return clsob
- class MyMeta(type, metaclass=SuperMeta):
- def __call__(cls, *args, **kwargs):
- print('MyMeta called', cls, args, kwargs)
- ob = object.__new__(cls, *args)
- ob.__init__(*args)
- return ob
- print('create class')
- class Kls(metaclass=MyMeta):
- def __init__(self, data):
- self.data = data
- def printd(self):
- print(self.data)
- print('class created')
- ik = Kls('arun')
- ik.printd()
- ik2 = Kls('avni')
- ik2.printd()
- class SuperMeta(type):
- def __call__(metaname, clsname, baseclasses, attrs):
- print 'SuperMeta Called'
- clsob = type.__new__(metaname, clsname, baseclasses, attrs)
- type.__init__(clsob, clsname, baseclasses, attrs)
- return clsob
- class MyMeta(type):
- __metaclass__ = SuperMeta
- def __call__(cls, *args, **kwargs):
- print 'MyMeta called', cls, args, kwargs
- class SuperMeta(type):
- def __call__(metaname, clsname, baseclasses, attrs):
- print 'SuperMeta Called'
- clsob = type.__new__(metaname, clsname, baseclasses, attrs)
- type.__init__(clsob, clsname, baseclasses, attrs)
- return clsob
- class MyMeta(type):
- __metaclass__ = SuperMeta
- def __call__(cls, *args, **kwargs):
- print 'MyMeta called', cls, args, kwargs
- ob = object.__new__(cls, *args)
- ob.__init__(*args)
- return ob
- print 'create class'
- class Kls(object):
- __metaclass__ = MyMeta
- def __init__(self, data):
- self.data = data
- def printd(self):
- print self.data
- print 'class created'
- ik = Kls('arun')
- ik.printd()
- ik2 = Kls('avni')
- ik2.printd()create class
- SuperMeta Called
- class created
- MyMeta called class '__main__.Kls' ('arun',) {}
- arun
- MyMeta called <class '__main__.Kls' ('avni',) {}
- avni
If you feel useful for you and for everyone, please share it!
Suggest for you:
Learn Python for Beginners!
Python, Ruby, Shell - Scripting for Beginner
Learning Python for Data Analysis and Visualization
Complete Python Bootcamp (Hot)
The Python Mega Course: Build 10 Python Applications