Эквивалент шаблона Python

#c #python-3.x #oop #templates

Вопрос:

Какой наиболее эффективный эквивалент шаблонов C в Python? например, как бы я реализовал следующее:

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

Моя нынешняя мысль состоит в том, чтобы использовать что-то вроде:

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

Но это кажется невероятно хакерским. Каков наилучший способ создать такое поведение?

В моем примере мне также нужно, чтобы FooCreated можно было разделить на подклассы.

Комментарии:

1. Как связаны эти 2 фрагмента кода? Что делает код C с X и Y и как это связано с подклассами?

2. Возьмите C и представьте, что КАЖДАЯ функция и КАЖДЫЙ класс были шаблоном. Это Python, готовый из коробки.

Ответ №1:

tl; dr: это бессмысленно, вам не нужен эквивалент.

Шаблоны — это механизм C , позволяющий использовать полиморфизм во время компиляции: при создании экземпляров с разными типами генерируется разный код, который может действовать по-разному. Это может быть шаблонная функция или шаблонный класс, как в вашем примере. Это важно, потому что в целом C является статически типизированным языком. Таким образом, если у вас:

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

тогда SomeType<3> и SomeType<4> являются совершенно разными типами. Вы не можете назначить экземпляр одного в экземпляр другого, вы не можете передать один в функцию, использующую другой и т.д. На самом деле, они были бы совершенно разными, даже если a бы член практически не зависел от X вообще.

Python — это язык с динамической типизацией. Итак, вы могли бы определить некоторую переменную, инициализировав ее значением одного типа, а затем полностью заменить это значение значением другого типа. В терминах C это как если бы у вас был an int x = 123; , и вы назначили его std::string("hello") — и он стал std::string x значением with "hello"s . Когда в вашем языке есть это, вам не нужно беспокоиться о создании экземпляров шаблонов типов с разными членами и т. Д. — Вы просто помещаете значения любого типа, которые вам нравятся, в переменную, или элемент списка, или что-то еще.

Смотрите также: