【问题标题】:Properly Implement Method Inheritance During Class Construction在类构建过程中正确实现方法继承
【发布时间】:2016-09-23 22:05:48
【问题描述】:

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

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_class 时,B 不正确存在。

【问题讨论】:

    标签: python inheritance super metaclass


    【解决方案1】:

    我有这个问题已经有一段时间了,但实际上找不到解释元类这一方面的帖子。事实上,我拥有它很长时间,以至于我想出了这个替代品,最终没有必要,solution。从技术上讲,它完全符合我想要的那种语法(这很酷),但最终它是一个 hack。由于我花了很长时间编写一些毫无意义(但仍然很酷)的代码,我想我至少会尝试确保没有其他人陷入同样的​​困境。

    我的困惑实际上源于我没有完全扩展我对元类的理解,以及它们与类之间的关系,得出其合乎逻辑的结论。所以,事实证明,创建我想要的那种继承的最好方法实际上是在一系列元类中执行它——出于同样的原因,试图通过类的实例继承属性是没有意义的,它没有使元类的实例具有多态性是有意义的:

    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
    

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

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 2016-06-06
      • 2018-05-10
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多