gpt4 book ai didi

python - 在类构建过程中正确实现方法继承

转载 作者:太空宇宙 更新时间:2023-11-03 16:32:51 24 4
gpt4 key购买 nike

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

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 并不正确存在。

最佳答案

我有这个问题很长一段时间了,但找不到真正解释元类这方面的帖子。事实上,我已经使用它很长时间了,以至于我想出了这个替代方案,但最终是不必要的,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

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

关于python - 在类构建过程中正确实现方法继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37451753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com