2010-08-16 7 views
6

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

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

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

ответ

14

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

+0

Я перешел на Py3 пару дней назад, думая, что, поскольку я сейчас просто студент, я должен научиться завтрашнему дню. Угадайте, что это был умный ход :-) – yrsnkd

+0

+1. Хорошее объяснение. –

+0

+1 Отличное объяснение, как всегда. – katrielalex

0

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