'''
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__)