在课堂建设中正确实施方法继承

时间:2016-05-26 04:41:47

标签: python inheritance super metaclass

如何在完全构造类之前调用​​的方法中实现类似超行为的行为。我可以实现一系列相互依赖的方法吗?

from six import with_metaclass

class Meta(type):
    """a metaclass"""

    def __init__(cls, name, bases, classdict):
        cls.setup_class()

    def setup_class(cls):
        pass


class A(with_metaclass(Meta, object)):
    """a class"""

    @classmethod
    def instantiate(cls, name):
        print("instantiating through '%s'" % name)

    @classmethod
    def setup_class(cls):
        cls.instantiate('A')


class B(A):

    @classmethod
    def setup_class(cls):
        super(B, cls).setup_class()
        cls.instantiate('B')

class C(B) pass

显然这不起作用,因为调用Bsetup_class不正确存在。

1 个答案:

答案 0 :(得分:1)

我有这个问题很长一段时间,并没有真正找到解释元类这方面的帖子。事实上,我已经有这么久了,所以我提出了这个备用,最终是不必要的,solution。从技术上讲,它完全符合我想要的语法(这很酷),但最终它是一个黑客。由于我花了很长时间制作一个毫无意义(但仍然很酷)的代码,我想我至少会尝试并确保没有其他人陷入同样的​​困境。

我的困惑真的源于这样一个事实:我没有完全扩展我对元类的理解,以及它们与类的关系,以及它的逻辑结论。因此,事实证明,创建我想要的继承类型的最佳方法实际上是在一系列元类中执行它 - 出于同样的原因,试图通过类的实例继承属性是没有意义的,它没有感觉是要创建元类多态的实例:

from six import with_metaclass

class Meta(type):
    """a metaclass"""

    def __init__(cls, name, bases, classdict):
        print("Beginning '%s' setup" % name)
        cls.setup_class()
        print("Finished '%s' setup \n" % name)

    def setup_class(cls):
        cls.attribute = 0
        cls.instantiate('Meta')


class AMeta(Meta):

    def setup_class(cls):
        super(AMeta, cls).setup_class()
        cls.instantiate('A')

    def instantiate(cls, name):
        print("instantiating through '%s'" % name)

class A(with_metaclass(AMeta, object)): pass


class BMeta(AMeta):

    def setup_class(cls):
        super(BMeta, cls).setup_class()
        cls.instantiate('B')

class B(with_metaclass(BMeta, object)): pass


class C(B): pass

如果有人愿意更彻底地检查这一点,我相信那里有人会很感激。