#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
. Когда в вашем языке есть это, вам не нужно беспокоиться о создании экземпляров шаблонов типов с разными членами и т. Д. — Вы просто помещаете значения любого типа, которые вам нравятся, в переменную, или элемент списка, или что-то еще.
Смотрите также:
- Иллюстрация динамически типизированной природы Python (tutorialspoint.com )
- Сообщение (sitepoint.com ) относительно статических и динамических языков.