如何在完全构造类之前调用的方法中实现类似超行为的行为。我可以实现一系列相互依赖的方法吗?
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
显然这不起作用,因为调用B
时setup_class
不正确存在。
答案 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
如果有人愿意更彻底地检查这一点,我相信那里有人会很感激。