В чем разница между параметризованный класс и метакласс (пожалуйста, примеры кода на Python)?

Авторы Hello Stack Overflow,

Я начинающий программист, изучающий Python прямо сейчас, и я нашел этот сайт , который помогает объяснить объектно-ориентированные парадигмы. Я знаю, что метаклассы - это классы классов (например, мета-каталоги являются каталогами каталогов и т. Д.), Но у меня возникли проблемы с чем-то: какова реальная разница между метаклассом и параметризованным классом, согласно определение веб-сайта?

Если вы можете, пожалуйста, включите примеры кода в Python, которые иллюстрируют различия между ними. Спасибо за вашу помощь!

6
задан S.L. Barth - Reinstate Monica 17 July 2012 в 16:37
поделиться

2 ответа

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

Опять же, это определенно не то, что вам часто понадобится - создание нескольких классов, которые отличаются одним или несколькими аргументами. В любом случае, как вы можете видеть, это не имеет абсолютно ничего общего с классом классов (он же метакласс), который в этом примере всегда имеет тип (и почти в каждом более реалистичном примере, который я мог придумать - я просто решил привести простой пример, где суть этого трудно различить, а не реалистичный и, следовательно, обязательно очень сложный ;-).

15
ответ дан 8 December 2019 в 15:58
поделиться

Эта запись может оказаться полезной. А этот старый, но его тоже стоит прочитать. Я знаю, что это не полностью отвечает на ваш вопрос, но надеюсь, что это дает вам пищу для размышлений.

0
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: