用于参数化继承的元类

2023-11-24

我读过一些关于 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(使用前将#替换为@)

用于参数化继承的元类 的相关文章