关于廖雪峰提到的元类的应用实例的解释

class Field(object):

    def __init__(self, name, column_type):
        self.name = name
        self.column_type = column_type

    def __str__(self):
        return ‘<%s:%s‘ % (self.__class__.__name__, self.name)

class StringField(Field):

    def __init__(self, name):
        super(StringField, self).__init__(name, ‘varchar(100)‘)

class IntegerField(Field):

    def __init__(self, name):
        super(IntegerField, self).__init__(name, ‘bigint‘)

class ModelMetaclass(type):

    def __new__(cls, name, bases, attrs):   #传入的是类的属性
        if name==‘Model‘:
           return type.__new__(cls, name, bases, attrs)
        print(attrs)
        print(‘Found model: %s‘ % name)
        mappings = dict()

        for k, v in attrs.items():
            if isinstance(v, Field):
                print(‘Found mapping: %s ==> %s‘ % (k, v))
                mappings[k] = v
        for k in mappings.keys():
            attrs.pop(k)
        attrs[‘__mappings__‘] = mappings # 保存属性和列的映射关系
        attrs[‘__table__‘] = name # 假设表名和类名一致
        return type.__new__(cls, name, bases, attrs)

class Model(dict, metaclass=ModelMetaclass):

    def __init__(self, **kw):
        super(Model, self).__init__(**kw)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"‘Model‘ object has no attribute ‘%s‘" % key)

    def __setattr__(self, key, value):
        self[key] = value

    def save(self):
        fields = []
        params = []
        args = []
        for k, v in self.__mappings__.items():
            fields.append(v.name)
            params.append(‘?‘)
            args.append(getattr(self, k, None))
        sql = ‘insert into %s (%s) values (%s)‘ % (self.__table__, ‘,‘.join(fields), ‘,‘.join(params))
        print(‘SQL: %s‘ % sql)
        print(‘ARGS: %s‘ % str(args))

class User(Model):
    # 定义类的属性到列的映射:
    id = IntegerField(‘id‘)
    name = StringField(‘username‘)
    email = StringField(‘email‘)
    password = StringField(‘password‘)

u = User(id=12345, name=‘Michael‘, email=‘[email protected]‘, password=‘my-pwd‘,sdfjojf=‘sdfe‘)
u.save()

当创建实例时,需要调用User类,首先会检查有没有__metaclass__属性,找到了,通过metalclass创建类(基于User类,传入的name为User,父类为Model,属性为User类的属性)。之后在实例化过程中,需要调用创建的新的User类中的方法,如果没有,需要到父类(metalclass创建新类会传承User类的父类)中查找,比如说之后会调用__init__方法,之后又调用save方法。

程序来源:

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319106919344c4ef8b1e04c48778bb45796e0335839000

时间: 2024-10-11 17:25:44

关于廖雪峰提到的元类的应用实例的解释的相关文章

Python利用元类来控制实例创建

问题: 改变实例创建方式,以此来实现单例模式,缓存或者其他类似的特性. 解决方法: 如果想定制化创建实例的过程,可以通过定制一个元类并以某种方式重新实现它的__call__()方法. 单例模式实现: class Singleton(type): def __init__(self, *args, **kwargs): self.__instance = None super().__init__(*args, **kwargs) def __call__(self, *args, **kwarg

类和元类

声明 本文译自class and metaclasses.非原创 类和元类十个鸡生蛋,蛋生鸡的混沌逻辑 正文 Objective-C是一中类基础的对象系统.每一个类都是类的实例;对象的isa指针指向它所属的类.类描述了对象的数据:分配的大小和实例变量类型以及布局形式.类也定义了对象的行为:选择器去应答实现的实例方法. 类的方法列表是一簇实例方法,对象可以应答的选择器.当你给一下实例发送消息,objc_msgSend()检索对象的类(或父类)的方法列表决定调用哪个方法. 每个类也是一个对象.它有一

反射与元类

1.isinstance与issubclass 在介绍反射之前,先来介绍两个关于类的内置方法,第一个是用来判断对象是否是某一类的对象(以前常说的判断是否是某一类型,类与类型其实是一个概念),第二个则是用来判断某一类是否是继承了另一个类 l=list([1,2,3]) print(isinstance(l,list)) #True class People: def __init__(self): pass class Chinese(People): def __init__(self): pa

16 元类

面向对象学习目录 1 面向对象介绍 2 类.实例.属性.方法详解 3 面向过程与面向对象进一步比较 4 类与对象 5 属性查找与绑定方法 6 小结 7 继承与派生 8 组合 9 抽象类 10 多态 11 封装 12 绑定方法与非绑定方法 13 内置方法(上) 14 内置方法(中)之描述符 15 内置方法(下) 16 元类 一 知识储备 exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默

Python之路(十二):描述符,类装饰器,元类

python基础之面向对象(描述符.类装饰器及元类) 描述符 描述符(__get__,__set__,__delete__)   # 这里着重描述了python的底层实现原理 1. 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议. __get__():调用一个属性时,触发 __set__():为一个属性赋值时,触发 __delete__():采用del删除属性时,触发 1 class

096 元类

一.什么是元类 在python里面,我们都知道一切都是对象 我们用calss关键字定义一个类出来,那这个类肯定也就是一个对象.那这个类肯定又是由另一个类实例化的来的,负责产生这个对象的类就称之为是元类 产生类的类叫做元类 元类:简称为类的类 二.如何去找元类 type是一个内置的元类,所有的类都是由type实例化得到的,产生类的类,叫元类 type的实例就是type,并且它还继承了object类,而object类也是type类的实例. class Person: def __init__(sel

廖雪峰Python学习笔记——使用元类

元类(MetaClasses) 元类提供了一个改变Python类行为的有效方式. 元类的定义是"一个类的类".任何实例是它自己的类都是元类. class demo(object): pass obj = demo() print "Class of obj is {0}".format(obj.__class__) print "Class of obj is {0}".format(demo.__class__) # Class of obj

metaclass(元类)的小探索

1.python 的metaclass 关于元类 在python中,有一经典解释文章,特别是注意到,而python中的基本元类就是type,type会根据传入参数的个数来决定发挥打印类型的函数功能或者发挥元类的作用.元类的自定义使用__metaclass__: (一)自定义metaclass 使用metaclass只需声明: __metaclass__ = something.. 放置元类的位置可以是任意的,python解释器进行查找元类的顺序这篇文章中已经详细说明:“如果Python没有找到_

Python学习笔记八 面向对象高级编程(二)元类

参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 在廖老师的学习网站里"使用元类"这部分还是把我给看晕了...网上搜到一篇感觉讲的相对易懂一些,贴出链接:两句话掌握 Python 最难知识点--元类--以此文作为这篇笔记的源本. "道生一,一生二,二生三,三生万物" 1.在Python世界中,"type"即为道