元类改写DjangoORM

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('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, **kwarg):
        super(Model, self).__init__(**kwarg)

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

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

    # 模拟建表操作
    def save(self):
        fields = []
        args = []
        for k, v in self.__mappings__.items():
            fields.append(v.name)
            args.append(getattr(self, k, None))
        sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join([str(i) for i in args]))
        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='Gregory', email='292409083@qq.com', password='iamgreg')
u.save()
Spring Boot 是一个用于简化 Spring 应用程序开发的框架,它提供了一种轻量级、快速启动的方式来构建 Spring 应用。在 Spring Boot 中,可以通过修改类加载器的名称来实现自定义的类加载行为。 在传统的 Java 应用中,类加载器负责将字节码加载到内存中,并将其转换为可执行的 Java 类。Spring Boot 则提供了一种更灵活的方式来修改类加载的名称。通过修改类加载器的名称,可以在运行时动态地加载和替换类,从而实现自定义的类加载逻辑。 在 Spring Boot 中,可以通过如下的方式来修改类加载器的名称: 1. 创建一个自定义的类加载器,并重写其中的 loadClass() 方法。 2. 在重写的 loadClass() 方法中,定义相应的类加载逻辑,并调用父加载器的 loadClass() 方法来加载其他类。 3. 在应用程序的启动过程中,通过设置系统属性 "java.system.class.loader" 来指定自定义类加载器。 具体实现的代码如下所示: ```java public class MyClassLoader extends ClassLoader { @Override public Class<?> loadClass(String name) throws ClassNotFoundException { // 自定义的类加载逻辑 if (name.startsWith("com.example")) { // 加载自定义的类 return findClass(name); } // 调用父加载器的 loadClass() 方法加载其他类 return super.loadClass(name); } } public class MyApp { public static void main(String[] args) { // 创建并设置自定义类加载器 MyClassLoader classLoader = new MyClassLoader(); System.setProperty("java.system.class.loader", classLoader.getClass().getName()); // 启动 Spring Boot 应用 SpringApplication.run(MyApp.class, args); } } ``` 通过以上的方式,可以实现在 Spring Boot 应用中修改类加载器的名称,并实现自定义的类加载逻辑。这样可以灵活地对类的加载行为进行控制,提高应用程序的可扩展性和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值