Skip to content

Instantly share code, notes, and snippets.

@carymrobbins
Last active August 29, 2015 13:57
Show Gist options
  • Save carymrobbins/9355223 to your computer and use it in GitHub Desktop.
Save carymrobbins/9355223 to your computer and use it in GitHub Desktop.
Auto inherit inner classes
class M(type):
def __new__(mcs, name, bases, attrs):
if bases:
b = attrs.pop('B', None)
if b:
bs = tuple(s for s in (c.__dict__.get('B') for c in bases) if s)
attrs['B'] = type('B', bs, b.__dict__)
return super(M, mcs).__new__(mcs, name, bases, attrs)
class A(object):
__metaclass__ = M
class B:
foo = 1
bar = 2
@classmethod
def spam(cls):
return cls.foo + cls.bar
class D(A):
class B:
baz = 3
@classmethod
def spam(cls):
return super(D.B, cls).spam() + cls.baz
assert isinstance(A, M)
assert A.B.foo == 1
assert A.B.bar == 2
assert A.B.spam() == 3
assert isinstance(D, M)
assert issubclass(D.B, A.B)
assert D.B.foo == 1
assert D.B.bar == 2
assert D.B.baz == 3
assert D.B.spam() == 6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment