我读过一些关于 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()
Output:
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()
函数是通常所说的函数的一个例子类工厂或实施工厂模式。所以,顺便说一句,你可能会发现我的答案对这个问题到底什么是类工厂?内容丰富。
Edit:添加了代码来为返回的每个子类创建不同的类名 - 灵感来自 @阿罗斯特林的见解(在现已删除的评论中)关于调试时如果制造的类始终具有相同名称的潜在混乱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)