Created
August 25, 2016 12:17
-
-
Save pahaz/a2676a2737da617a5ef8efbb55451710 to your computer and use it in GitHub Desktop.
Short story about how metaclasses work
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
print('class Meta(type)') | |
class Meta(type): | |
@classmethod | |
def __prepare__(mcs, name, bases, **kwargs): | |
print(' Meta.__prepare__(mcs=%s, name=%r, bases=%s, **%s)' % ( | |
mcs, name, bases, kwargs | |
)) | |
return super().__prepare__(mcs, name, bases) | |
@staticmethod | |
def __new__(mcs, name, bases, attrs, **kwargs): | |
print(' Meta.__new__(mcs=%s, name=%r, bases=%s, attrs=[%s], **%s)' % ( | |
mcs, name, bases, ', '.join(attrs), kwargs | |
)) | |
return super().__new__(mcs, name, bases, attrs) | |
def __init__(cls, name, bases, attrs, **kwargs): | |
print(' Meta.__init__(cls=%s, name=%r, bases=%s, attrs=[%s], **%s)' % ( | |
cls, name, bases, ', '.join(attrs), kwargs | |
)) | |
return super().__init__(name, bases, attrs) | |
def __call__(cls, *args, **kwargs): | |
print(' Meta.__call__(cls=%s, args=%s, kwargs=%s)' % ( | |
cls, args, kwargs | |
)) | |
return super().__call__(*args, **kwargs) | |
def __getattribute__(cls, name): | |
print(' Meta.__getattribute__(cls=%s, name=%s)' % (cls, name)) | |
return super().__getattribute__(name) | |
print('class Class(metaclass=Meta)') | |
class Class(metaclass=Meta): | |
@staticmethod | |
def __new__(cls, *args, **kwargs): | |
print(' Class.__new__(cls=%s, args=%s, kwargs=%s)' % ( | |
cls, args, kwargs | |
)) | |
return super().__new__(cls, *args, **kwargs) | |
def __init__(self, *args, **kwargs): | |
print(' Class.__init__(self=%s, args=%s, kwargs=%s)' % ( | |
self, args, kwargs | |
)) | |
return super().__init__(*args, **kwargs) | |
def __getattribute__(self, name): | |
print(' Class.__getattribute__(self=%s, name=%s)' % (self, name)) | |
return super().__getattribute__(name) | |
def foo(self): | |
print('Class.foo(%s)' % self) | |
def bar(self, *args, **kwargs): | |
print('Class.bar(%s, *%r, **%r)' % (self, args, kwargs)) | |
print('class SubClass(Class)') | |
class SubClass(Class): | |
def foo(self): | |
print('SubClass.foo(%s)' % self) | |
print('instances') | |
a = SubClass() | |
a.bar(1, a=2) | |
a.foo() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment