Created
January 26, 2015 23:13
-
-
Save gasman/8e7eb18686af0af966ef to your computer and use it in GitHub Desktop.
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
import six | |
class ModelBase(type): | |
def __new__(meta, name, bases, dct): | |
print("ModelBase.__new__(%s)" % name) | |
result = super(ModelBase, meta).__new__(meta, name, bases, dct) | |
print("/ModelBase.__new__(%s)" % name) | |
return result | |
def __init__(cls, name, bases, dct): | |
print("ModelBase.__init__(%s)" % name) | |
super(ModelBase, cls).__init__(name, bases, dct) | |
print("/ModelBase.__init__(%s)" % name) | |
class Model(six.with_metaclass(ModelBase, object)): | |
pass | |
print("\n") | |
class PageBase(ModelBase): | |
def __new__(meta, name, bases, dct): | |
print("PageBase.__new__(%s)" % name) | |
result = super(PageBase, meta).__new__(meta, name, bases, dct) | |
print("/PageBase.__new__(%s)" % name) | |
return result | |
def __init__(cls, name, bases, dct): | |
print("PageBase.__init__(%s)" % name) | |
super(PageBase, cls).__init__(name, bases, dct) | |
print("/PageBase.__init__(%s)" % name) | |
class Page(six.with_metaclass(PageBase, Model)): | |
pass | |
print("\n") | |
class Mixin(Model): | |
pass | |
print("\n") | |
class BlogPost(Mixin, Page): | |
pass | |
print("\n") | |
class DonationsPage(Page, Mixin): | |
pass | |
""" | |
On Python 2.7, putting Mixin ahead of Page in BlogPost's superclass list | |
results in a call chain of ModelBase -> PageBase -> ModelBase - | |
i.e. ModelBase.__new__ is called twice: | |
ModelBase.__new__(BlogPost) | |
PageBase.__new__(BlogPost) | |
ModelBase.__new__(BlogPost) | |
/ModelBase.__new__(BlogPost) | |
/PageBase.__new__(BlogPost) | |
/ModelBase.__new__(BlogPost) | |
PageBase.__init__(BlogPost) | |
ModelBase.__init__(BlogPost) | |
/ModelBase.__init__(BlogPost) | |
/PageBase.__init__(BlogPost) | |
On Python 3, the call chain is PageBase -> ModelBase: | |
PageBase.__new__(BlogPost) | |
ModelBase.__new__(BlogPost) | |
/ModelBase.__new__(BlogPost) | |
/PageBase.__new__(BlogPost) | |
PageBase.__init__(BlogPost) | |
ModelBase.__init__(BlogPost) | |
/ModelBase.__init__(BlogPost) | |
/PageBase.__init__(BlogPost) | |
""" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment