zoukankan      html  css  js  c++  java
  • 元类

    '''
    1、元类:
    1.什么是元类?
    元类就是类的类,Chinese类的类是type,type是所有类的类,type就是一个元类。

    2.元类的作用?
    元类可以帮助我们控制类的创建。

    3.如何自定义元类? 如何使用元类?
    3.1自定义一个元类,继承type,派生出自己的属性与方法。
    3.2给需要使用的类,通过metaclass指定自定义的元类。
    --class chinese(metclass='自定义的元类')

    2、ORM是什么?使用ORM的好处?
    ORM是对象关系映射-->映射到数据库mysql中的数据表
    类名-->表名
    对象-->一条记录
    对象.属性-->字段

    好处是:模拟django的ORM,将数据库的增删改查,全部封装成一个个的方式,比如:save, delete, update, select

    3、手撸字段类、模型表类、Models类、元类。

    what:类名-->type对象的名称空间
    bases:基类/父类
    dict:类的名称空间
    #元类
    class MyMeta(type):
        def __init__(self, class_name, class_base,class_dict):
            if not class_name.istitle():
                raise TypeError('类的首字母必须大写!')
            if not class_dict.get('__doc__'):
                raise TypeError('类内部必须要写注释!')
            super().__init__(class_name, class_base,class_dict)
        def __call__(self, *args, **kwargs):
            obj = object.__new__(self)
            obj.__init__(*args, **kwargs)
            return obj
    class Bar:
        pass
    class Foo(Bar, metaclass=MyMeta):
        '''
        这是一个Foo类
        '''
        x = 10
        def __init__(self, y, z):
            self.y = y
            self.z = z
        def f1(self):
            print('from Foo.f1...')
     foo = Foo(20, 30)
    
    #字段类
    class Field:
        def __init__(self, name, column_type, primary_key, default):
            self.name = name
            self.column_type = column
            self.primary_key = primary_key
            self.default = default
    class InteggerField(Filed):
        def __init__(self, name, column_type='int', primary_key=False, default=0):
            super().__init__(name, column_type, primary_key,default)
    class StringField(Filed):
        def __init__(self, name,                    column_type='varchar(64)',primary_key=False,default=None):
            super().__init__(name, column_type, primary_key, default)
            
    #models类
    class Models(dict, metaclass=OrmMetaClass):
        def __getattr__(self, item):
            print(item,'调用没有的属性时会触发...')
            return self.get(item)
        
        def __setattr__(self, key, value):
            print(key, value)
            self[key] = value
     
    #模型表类
    class User(Models):
        user_id = IntegerField(name='user_id', primary_key=True)
        user_name = StringField(name='name')
        pwd = StringField(name='pwd')
    
    class Movie(Modles):
        user_id = IntegerField(name='user_id', primary_key=True)
        user_name = StringField(name='name')
        pwd = StringField(name='pwd')
        
    if __name__ == '__main__':
        print(User.__dict__)
            
    我把月亮戳到天上 天就是我的 我把脚踩入地里 地就是我的 我亲吻你 你就是我的
  • 相关阅读:
    将博客搬至CSDN
    ActiveMQ 的可持久化(六)
    ActiveMQ之协议(五)
    ActiveMQ与Spring / SpringBoot 整合(四)
    ActiveMQ之JMS及保证消息的可靠性<持久化、事务、签收>(三)
    ActiveMQ部署和代码尝试(二)
    ActiveMQ初步安装使用(一)
    Redis之哨兵机制(五)
    Redis主从复制(读写分离)(四)
    Redis持久化(三)
  • 原文地址:https://www.cnblogs.com/zhulipeng-1998/p/12863923.html
Copyright © 2011-2022 走看看