正确实施类构建过程中的方法继承

2024-03-29 12:15:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

显然这是行不通的,因为调用setup_classB并不正确存在


Tags: 方法namefromimportdefwithsetuppass
1条回答
网友
1楼 · 发布于 2024-03-29 12:15:59

我问这个问题已经有一段时间了,但找不到一篇文章来解释元类的这一方面。事实上,我有它这么长时间,我想出了这个替代品,最终没有必要,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

如果有人想更彻底地研究这个问题,我相信有人会很感激的

相关问题 更多 >