В чем разница между параметризованным классом и метаклассом (примеры кода на Python, пожалуйста)? - PullRequest
6 голосов
/ 16 августа 2010

Hello Stack Overflow,

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

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

Ответы [ 2 ]

15 голосов
/ 16 августа 2010

Python не имеет (или не нуждается) в «параметризованных классах», поэтому трудно привести примеры их в Python ;-).Метакласс - это просто «класс класса»: обычно type (если в Py2, как вы помните, сделать класс новым, наследуя от object, или какой-либо другой встроенный тип, или другой новый-style class - классы старого стиля являются устаревшим артефактом в Py2, к счастью, исчезли в Py3, и в идеале вы должны просто забыть о них).Вы можете создать собственный метакласс (обычно подкласс type) для нескольких сложных целей, но маловероятно, что вам когда-либо понадобится для (особенно если учесть, что, начиная с 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

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

0 голосов
/ 16 августа 2010

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

...