元类

'''
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__)
        
posted @ 2019-11-06 00:12  Mr-Allen  阅读(102)  评论(0编辑  收藏  举报