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
(и почти в каждом более реалистичном примере, о котором я мог думать - я просто решил дать простой пример, где смысл делать это трудно различить, а не реалистично и поэтому обязательно очень сложно ;-).
Я перешел на Py3 пару дней назад, думая, что, поскольку я сейчас просто студент, я должен научиться завтрашнему дню. Угадайте, что это был умный ход :-) – yrsnkd
+1. Хорошее объяснение. –
+1 Отличное объяснение, как всегда. – katrielalex