Python中的元编程

元编程概念来自lisp和smalltalk

 

用于生成代码的程序成为元程序metaprogram,编写这种程序就成为元编程metaprogramming Python语言能够通过反射实现元编程。

1type

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使用了元类,让我们使用起来很方便。

写框架使用的。

posted @ 2018-11-12 23:32  Python爱好者666  阅读(235)  评论(0编辑  收藏  举报