Авторы Hello Stack Overflow,
Я начинающий программист, изучающий Python прямо сейчас, и я нашел этот сайт , который помогает объяснить объектно-ориентированные парадигмы. Я знаю, что метаклассы - это классы классов (например, мета-каталоги являются каталогами каталогов и т. Д.), Но у меня возникли проблемы с чем-то: какова реальная разница между метаклассом и параметризованным классом, согласно определение веб-сайта?
Если вы можете, пожалуйста, включите примеры кода в Python, которые иллюстрируют различия между ними. Спасибо за вашу помощь!
Python не имеет (или не нуждается) в «параметризованных классах», поэтому трудно предоставить их примеры в Python ;-). Метакласс - это просто «класс класса»: обычно тип
(пока в Py2, если вы помните, чтобы сделать класс новым стилем, унаследовав от объекта
или какого-то другого другой встроенный тип или другой класс нового стиля - классы старого стиля являются устаревшим артефактом в Py2, к счастью, исчезли в Py3, и в идеале вы должны просто забыть о них). Вы можете создать собственный метакласс (обычно подклассы типа
) для нескольких продвинутых целей, но маловероятно, что вам когда-нибудь понадобится для (особенно учитывая, что, начиная с python 2.6, большая часть то, что раньше требовало настраиваемого метакласса, теперь можно сделать проще с помощью декоратора класса).
Для любого класса C type (C)
является его метаклассом.
Параметризованный класс - это совершенно другое понятие. Ближе всего к нему в Python, вероятно, является фабричная функция, которая создает и возвращает класс на основе своих аргументов:
def silly(n):
class Silly(object):
buh = ' '.join(n * ['hello'])
return Silly
Silly1 = silly(1)
Silly2 = silly(2)
a = Silly1()
print(a.buh)
b = Silly2()
print(b.buh)
будет печатать
hello
hello hello
Опять же, это определенно не то, что вам часто понадобится - создание нескольких классов, которые отличаются одним или несколькими аргументами. В любом случае, как вы можете видеть, это не имеет абсолютно ничего общего с классом классов (он же метакласс), который в этом примере всегда имеет тип
(и почти в каждом более реалистичном примере, который я мог придумать - я просто решил привести простой пример, где суть этого трудно различить, а не реалистичный и, следовательно, обязательно очень сложный ;-).
Эта запись может оказаться полезной. А этот старый, но его тоже стоит прочитать. Я знаю, что это не полностью отвечает на ваш вопрос, но надеюсь, что это дает вам пищу для размышлений.