Skip to content

Instantly share code, notes, and snippets.

@tempusfrangit
Created August 10, 2017 17:26
Show Gist options
  • Save tempusfrangit/dceb6be7c861febbc0e0ef40cfc18016 to your computer and use it in GitHub Desktop.
Save tempusfrangit/dceb6be7c861febbc0e0ef40cfc18016 to your computer and use it in GitHub Desktop.
Meta Example
`import re
import six
class Meta(type):
registry = {}
def __new__(meta, name, bases, class_dict):
cls = None
parts = [p.lower() for p in re.split(r'([A-Z][a-z]*)', name) if p]
name = '_'.join(parts)
if '__init__' in class_dict:
__init_found_in_class_dict__ = True
__init_fn_from_class__ = class_dict['__init__']
else:
__init_found_in_class_dict__ = False
def init_replace(self, *args, **kwargs):
Meta.registry[name] = self
if __init_found_in_class_dict__:
__init_fn_from_class__(self, *args, **kwargs)
else:
super(cls, self).__init__(self, *args, **kwargs)
class_dict['__init__'] = init_replace
cls = type.__new__(meta, name, bases, class_dict)
return cls
registry = Meta.registry
@six.add_metaclass(Meta)
class IdentityApi(object):
def __init__(self):
self.x = None
def foo(self):
return 'foo'
@six.add_metaclass(Meta)
class CredentialProviderApi(object):
def __init__(self):
self.x = None
def bar(self):
return 'bar'
identity = IdentityApi()
credential_provider = CredentialProviderApi()
assert ('identity_api' in registry.keys())
assert ('credential_provider_api' in registry.keys())
assert isinstance(registry['identity_api'], IdentityApi)
assert isinstance(registry['credential_provider_api'], CredentialProviderApi)
`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment