In Python we use the type function to dynamically create a meta-class, as well as to use the __metaclass__ property to specify a meta-class, and then we will give a concrete example of the creation and use of the Metaclass meta-class in Python
A meta-class is a way for you to define how certain classes are created. Fundamentally, gives you control over how to create classes.
A meta-class is also a class, which is a type class.
A meta class is typically used to create classes. When executing a class definition, the interpreter must know the correct meta-class of the class, and if this property is not defined, it will look up the __metaclass__ property in the parent class. If you haven't found it yet, look for global variables.
For traditional classes, their meta-class is types. ClassType.
The Meta class also has constructors that pass three parameters: the class name, the tuple that inherits the data from the base class, and the Class property dictionary.
Let's define a meta class that requires the class to be provided with a __str__ () method, if no __repr__ () method is provided,
You'll be warned.
The From warnings import warn# class needs to inherit type class Reqstrsugrepr (type): def __init__ (CLS, name, bases, ATTRD): # The constructor needs to pass the arguments to the class name, the base class, and the Class Property dictionary Super (REQSTRSUGREPR, CLS). __INIT__ (name, bases, ATTRD) # Determine if the __str__ string is in the class's Property dictionary if ' __str__ ' not in ATTRD: raise TypeError (' Class requires overriding of __str__ () ') if ' __repr__ ' isn't in ATT RD: warn (' Class suggests overriding of __repr__ () \ n ', stacklevel=3) Class Foo (object): #给类指定元类 __ metaclass__ = Reqstrsugrepr def foo (self): pass# This piece of code does not need to create a class to test, run directly will be error, visible meta-class skill.
Type
The type function can see the types of a variable, such as:
# <type ' int ' ># <type ' str ' >type (1) type (' mink ')
The type function can also create a new object
Type accepts three parameters, name, bases, Dict first accepts class name, second parameter accepts parent class (tuple form), third parameter accepts property and method (dictionary form)
x = Type (' x ', (object,), Dict (a=1)) # equals class X (object): a = 1
Here's how to accept a function
Def say (self): print ' hello ' x = Type (' x ', (object,), Dict (Say=say)) x = x () # pirnt Hellox.say ()
Meta class
We all know that a class can create an instance object, whereas a meta-class is a class that creates a class object. Type can create a class object, which means that the type is a meta-class.
Metaclass Property
If you want to create a class object using a meta-class, you need to add a __metaclass__ property to the object. Of course, you have to have a meta-class first.
Class Privatemetaclass (Type): def __new__ (CLS, name, parents, attrs): attrs = Dict ((' __%s '% K, v) for K, V in ATT Rs.itmes ()) return Super (Privatemetaclass, CLS). __new__ (CLS, name, parents, Attrs) class A (object): __ metaclass__ = Privatemetaclass a = 1 b = 2a = A () # Raise Attributeerrorprint a.a, a.b # print 1, 2print a.__a, a._ _b
This allows you to modify some of the properties of the class by using a meta class, which is to modify the variable to be a private variable.