Python `template`等价

vshtjzan  于 2023-05-30  发布在  Python
关注(0)|答案(2)|浏览(143)

Python中与C++模板最有效的等价物是什么?例如,我将如何实现以下内容:

template<unsigned X, unsigned Y>
class SomeType {
...
}

我现在的想法是使用类似的东西:

def FooFactory(*params):
  class FooCreated:
    # do stuff with params
    ...
  return FooCreated

但这感觉非常古怪。创造这种行为的最好方法是什么?
在我的例子中,我还需要FooCreated能够被子类化。

ctzwtxfj

ctzwtxfj1#

tl;dr:这是无意义的,你不需要一个等价物。

模板是一种允许编译时多态的C机制:当用不同的类型示例化时,会生成不同的代码-它们的行为可能不同。它可以是一个模板化的函数,也可以是一个模板化的类,就像你的例子一样。这一点很重要,因为一般来说,C是一种静态类型语言。因此,如果您有:

template<unsigned X>
class SomeType {
   std::array<int, X> a;
}

那么SomeType<3>SomeType<4>是完全不同的类型。你不能把一个示例赋值给另一个示例,你不能把一个示例传递给一个接受另一个示例的函数,等等。实际上,即使a成员实际上根本不依赖于X,它们也是完全不同的。
Python是一种动态类型语言。因此,您可以定义一些变量,用一种类型的值初始化它,然后用另一种类型的值完全替换该值。用C++的术语来说,就好像你有一个int x = 123;,你给它赋值std::string("hello")--它就变成了一个值为"hello"sstd::string x。当你的语言有了这个功能,你就不需要为示例化不同成员类型的模板而烦恼了--你只需要把你喜欢的任何类型的值放在一个变量中,或者一个列表的元素中,或者其他什么。
参见:

nzk0hqpo

nzk0hqpo2#

下面是我在Python中如何表达模板类的东西:

def funcGen(X, Y):
   def func(*args, **kwargs):
      //work  with X and Y class

然后,无论你想 * 专门化模板 *:

myfunc = funcGen(myXClass, myYClass)

相关问题