Python中的元编程
元编程概念来自lisp和smalltalk
用于生成代码的程序成为元程序metaprogram,编写这种程序就成为元编程metaprogramming Python语言能够通过反射实现元编程。
1、type
class type(object):
def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__
"""
type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new
type
# (copied from class doc)
"""
pass
type(name,bases,dict)> a new type返回一一个新的类型。
Type(name,bases,dict)返回一个新的类型;
Metaclass=类继承的就是元类了、就是元类的,不写的话直接就是基类。
可以借助type构造任何类,用代码来生成代码,这个就是元编程。
继承列表里面也写metaclass关键字=自已定义的类。
不写的话直接继承type类。
2、元编程的应用
Attrs是属性的字典。
对照关系:
表、列、行
类、类属性、类实例
ORM:对象关系映射,解决了实际上用SQL语句操作的对象。
class Field:
def __init__(self,fieldname=None,pk=False,nullable=False):
self.fieldname = fieldname
self.pk = pk
self.nullanle = nullable
def __repr__(self):
return '<field{}>'.format(self.fieldname)
class ModelMeta(type):
def __new__(cls,name ,bases,attrs:dict):
print(cls) 打印什么类
print(name) 打印名字
print(bases) 打印基类
print(attrs) 打印字典名字
if '__tablename__' not in attrs.keys():
attrs['__tablename'] = name
primarykeys = []
for k,v in attrs.items():
if isinstance(v,Field):
if v.fieldname is None:
v.fieldname = k
if v.pk:
primarykeys.append(v)
attrs['__primarykeys__'] =
primarykeys
return super().__new__(cls,name,bases,attrs)
class ModelBase(metaclass=ModelMeta):
##从ModelBase继承的类的类型都是ModelMeta
pass
class Student(ModelBase):
id = Field(pk=True,nullable=False)
name = Field('username',nullable=False)
age = Field()
print(Student.__dict__)
Student类在modelbase继承的,modelbase继承的是ModelMeta,所以student也是继承的modelmeta。
2 <class '__main__.ModelMeta'>
3 ModelBase
4 ()
5 {'__module__': '__main__', '__qualname__': 'ModelBase'}
--------------------------
2 <class '__main__.ModelMeta'>
3 Student
4 (<class '__main__.ModelBase'>,)
5 {'__module__': '__main__', 'age': <1fieldNone>, 'name': <1fieldusername>, '__qualname__': 'Student', 'id': <1fieldNone>}
--------------------------
6 {'name': <1fieldusername>, '__primarykeys__': [<1fieldid>], '__doc__': None, 'id': <1fieldid>, '__tablename': 'Student', '__module__': '__main__', 'age': <1fieldage>}
3、元编程总结
是制造类的工厂,是生产类的类。
定义一个元类,需要使用type(name,bases,dict)
也可以继承type。
构造好元类,就可以在类定义中使用关键字参数metaclass指定元类,可以使用最原始的dict()的方式构造一个类。元类的__new__()方法中,可以获取元类信息、当前基类、类属性字典。
元编程一般用于框架开发中。
Django、SQLalchemy使用了元类,让我们使用起来很方便。
写框架使用的。