Метакласове

„ Програмиране с Python“, ФМИ

Стефан Кънев & Николай Бачийски

16.05.2007г.

[Metaclasses] are deeper magic than 99% of users should ever worry about. If you wonder whether you need them, you don't (the people who actually need them know with certainty that they need them, and don't need an explanation about why).

Tim Peters

Какво е метаклас?



Метаклас — клас, чийто инстанции са класове.



Забравете предишнoto твърдение.

Метапрограмиране

Метакласовете като инструмент за метапрограмиране

Употреба: регистрация/търсене

Искаме да видим всички класове, които са се регистрирали в нашата система.

Пример: имаме зоологическа градина с цяла йерархия от класове, като позволяваме на програмистите да дефинират нови класове от животни. Как да видим всички класове животни? Как да видим всичко животни, които могат да плуват? Как да намерим всички животни наследник на класа Риба?

Употреба: проверки при създаване на класове

Внимавайте да не сте много строги.

Употреба: създаване на специални класове

В Python

Какво може/трябва да има един метаклас?

Пример 0: JustInit


__metaclass__ = type
class JustInit(type):
	baba = 6
	def a__call__(cls, *args):
		newo = cls.__new__(cls, cls.__name__, cls.__bases__, cls.__dict__)
		if hasattr(newo, 'init') and callable(getattr(newo, 'init')):
			newo.init(*args)
		return newo
	def __new__(cls, clsname, bases, d):
		return 5 

	def __init__(self, *args):
		self.__init__ = self.init
		self.__call__ = lambda x: 77

class X(object):
	__metaclass__ = JustInit
	def __init__(self): print "__init__"
	def init(self):
		self.x = 18
# X = X.__metaclass__('X', (object,), {...})

# f = obj(3)
# type.__call__(cls, *args):
# 	newo = cls.__new__()
#   cls.__init__(newo, *args)
#	return newo
print type(X)
x = X()
print x()
print type(x)
#print x.baba
#print X.baba