gpt4 book ai didi

c++ - 参数化继承的元类

转载 作者:太空狗 更新时间:2023-10-29 22:23:57 25 4
gpt4 key购买 nike

我已经阅读了一些关于 Python 元类的教程。我以前从未使用过,但我需要一个来处理相对简单的事情,而且所有教程似乎都针对更复杂的用例。我基本上想创建一个模板类,它有一些预先指定的主体,但将其基类作为参数。由于我的想法是从 C++/D 模板中得到的,下面是我想要编写的代码在 C++ 中的示例:

template<class T>
class Foo : T {
void fun() {}
}

最佳答案

虽然它当然可以用元类来完成,但你可以在没有元类的情况下做你想做的事,因为在 Python 中类本身就是对象。令人惊讶的是,这意味着基本上只需要对 C++ 代码进行几乎一对一的翻译。除了因此相对简单之外,它还可以在 Python 2 和 3 中无需修改就可以工作。

def template(class_T):
"""Factory function to create subclasses of class_T."""

class Foo(class_T):
def fun(self):
print('%s.fun()' % self.__class__.__name__)

Foo.__name__ += '_' + class_T.__name__ # rename the subclass to reflect its heritage
return Foo

class Base1:
def bar(self):
print('Base1.bar()')

class Base2:
def bar(self):
print('Base2.bar()')

Foo_Base1 = template(Base1)
print('Foo_Base1 base classes: {}'.format(Foo_Base1.__bases__))

Foo_Base2 = template(Base2)
print('Foo_Base2 base classes: {}'.format(Foo_Base2.__bases__))

subclass1 = Foo_Base1()
subclass1.fun()
subclass1.bar()
subclass2 = Foo_Base2()
subclass2.fun()
subclass2.bar()

输出:

Foo_Base1 base classes: (<class __main__.Base1 at 0x00A79C38>,)
Foo_Base2 base classes: (<class __main__.Base2 at 0x00A79DC0>,)
Foo_Base1.fun()
Base1.bar()
Foo_Base2.fun()
Base2.bar()

(缺乏想象力的名称)template() 函数中的代码是通常称为 class factory 的示例。或工厂模式的实现。所以,顺便说一句,你可能会发现 my answer问题What exactly is a Class Factory?内容丰富。

编辑:添加代码为返回的每个子类创建不同的类名——灵感来自@aaronasterling。如果制造的类始终具有相同的名称,则在调试时可能会造成混淆(在现已删除的评论中)。

关于c++ - 参数化继承的元类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3876921/

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