dsi*_*cha 6 c++ python templates metaprogramming metaclass
我已经阅读了一些关于Python元类的教程.我之前从未使用过一个,但我需要一个相对简单的东西,所有的教程似乎都面向更复杂的用例.我基本上想要创建一个具有一些预先指定的主体的模板类,但是将其基类作为参数.因为我从C++/D模板中得到了这个想法,这里是我想要编写的代码在C++中的样子:
template<class T>
class Foo : T {
void fun() {}
}
Run Code Online (Sandbox Code Playgroud)
虽然它确实可以用元类来完成,但是你可以在没有它们的情况下做你想做的事情,因为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()
Run Code Online (Sandbox Code Playgroud)
输出:
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()
Run Code Online (Sandbox Code Playgroud)
(univginatively-named)template()函数中的代码是通常称为类工厂或Factory模式的实现的示例.所以,顺便说一句,你可能会找到我对问题的答案究竟是什么类工厂?翔实.
编辑:添加了代码,为每个返回的子类创建不同的类名 - 这是受@ aaronasterling的洞察力(在一个现已删除的注释中)的启发,关于调试时可能产生的混淆,如果制造的类总是具有相同的名称.