美文网首页
python中元类

python中元类

作者: IT入门指南 | 来源:发表于2019-04-12 11:32 被阅读0次

小小的提示

python中一切皆是对象
python中类也是对象
python 中可以通过type来创建一个类对象
my_class = type("MyClass", (),  {})
元类就是用来创建简单易用的api, 隐藏具体繁琐的实现细节
元类的操作就是动态的拦截类,修改类,然后返回修改之后的类
ps:在python中动态的修改创建的类 可以使用类装饰器
在python 类的创建寻找元类的顺序 
1 当前类中是否有_metaclass_属性, 如果有则通过_metaclass_指定
的元类来创建改类,
2 如果没有, 寻找父类,
3 如果所有的父类没有找到,使用系统自带的type来创建该类

实际的例子

class Field:
    def __init__(self, default_value):
        self.default_value = default_value


class StringField(Field):
    def __init__(self, default_value):
        super(StringField, self).__init__(default_value)


class IntegerField(Field):
    def __init__(self, default_value):
        super(IntegerField, self).__init__(default_value)


class MetaClass(type):
    def __new__(cls, cls_name, cls_attr, cls_dict, **kwargs):
        if 'Model' == cls_name:
            return type.__new__(cls, cls_name, cls_attr, cls_dict, **kwargs)
        mapping = dict()

        for k, v in cls_dict.items():
            if isinstance(v, Field):
                mapping[k] = v
        for k in mapping.keys():
            cls_dict.pop(k)

        cls_dict['__mapping__'] = mapping
        cls_dict['__table__'] = cls_name
        return type.__new__(cls, cls_name, cls_attr, cls_dict, **kwargs)


class Model(metaclass=MetaClass):
    def __init__(self, **kwargs):
        super(Model, self).__init__(**kwargs)

    def __getattr__(self, item):
        return self[item]

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

    def save(self):
        for k, v in self.__mapping__.items():
            print(v.default_value)


class User(Model):
    name = StringField(default_value="user_name")
    age = IntegerField(default_value=10)


user = User()
user.save()

相关文章

  • python中元类

    小小的提示 实际的例子

  • 对python中元类的理解

    1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:...

  • Python NumPy Array,python 数组中元素计

    Python NumPy Array python 数组中元素计算 Python计算体重指数 Python让数组中...

  • NumPy之数据基础

    numpy.array 基础 Python List 的特点 列表中元素类型不必相同 Python中的array ...

  • iOS中元类和类

    元类和类的数据结构是同一个,只是运行时使用的字段不一样。 实例方法调用是通过objc_msgSend来调用,它的第...

  • python收藏的干货

    python百例——Python文集类Python 学习笔记——Python文集类

  • #Day07总结

    认识列表 1、列表是python中的容器类数据类型,可以用来存储多个数据是可变的,有序的可变是指列表中元素的值、位...

  • python中元祖

    1.认识元祖 1.什么是元祖 使用()将多个元素括起来,多个之间用逗号隔开。a.容器,可以同时存储多个数据,不可变...

  • 类的继承顺序

    python2新式类继承object的类python2经典类未继承任何类的python2新式类和python3的继...

  • Python类Class

    创建方式 创建Python类 打开Run Module界面 Python类使用 Python类的init功能

网友评论

      本文标题:python中元类

      本文链接:https://www.haomeiwen.com/subject/omoqwqtx.html