在django 之中元类使我们的对象变成了表结构,模型类原来是这么来的!
django 的模型类这么强大,后来我去看了看源码,原来是通过元类来改变类属行的(变成我们习惯的风格!)
类对象和数据库竟然着这么联系在一起的!!
from pymysql import connect
class test(type): '''通过继承的方法来实现元类,元类可以为类增加新的属性!就像16行''' def __new__(cls, class_name, supers_name, attrs): # print(attrs) pram = dict() for emp, values in attrs.items(): if isinstance(values, tuple): pram[emp] = values[0] # 是为了取出里面的值! attrs['class_name'] = class_name # 创建一个新属性指向class_name # print(pram) attrs["pram"] = pram # 创建一新属性 pram 指向pram 也就是创建一个字典! return type.__new__(cls, class_name, supers_name, attrs)
class user(metaclass=test): def create(self): '''self.class_name 是元类创建的更改了类的结构! ''' conn = connect(host='localhost', port=3306, user="root", password="x", database="jing_dong", charset='utf8') # 得到游标对象 cs1 = conn.cursor() li = list() for emp, values in self.pram.items(): li.append("%s %s" % (emp, values)) sql = """CREATE TABLE IF NOT EXISTS %s(%s); """ % (self.class_name, ",".join(li)) # print(sql) # 2执行Sql语句 cs1.execute(sql) # 关闭 cs1.close() conn.close() def insert(self, **kwargs): conn = connect(host='localhost', port=3306, user="root", password="x", database="jing_dong", charset='utf8') # 得到游标对象 cs1 = conn.cursor() key = list() value = list() print(self.pram) for emp, values in kwargs.items(): key.append(emp) if isinstance(values, int): value.append(str(values)) else: value.append("'%s'" % values) # 加上单引号的目的是为了转换sql 语句 # sql语句 sql = """ insert into user (%s) values (%s); """ % (",".join(key), ','.join(value)) print(sql) # 2执行Sql语句 cs1.execute(sql) conn.commit() # 获取这个数据 table_data = cs1.fetchall() # 关闭 cs1.close() conn.close() class Student(user): # 自动创建表 name = ("varchar(30)",) # 元组 以元组的形式存储更好的取值! 也是为了元类(11行)能够取到值! age = ("int",) def main(): '''创建类实际上是创建了字段!''' student = Student() student.create() if __name__ == '__main__': main()
很巧妙吧!类对象可以成为数据库的表,类属性竟然变成数据库的表结构!!!