当定义一个函数、类、全局变量时,其实就是创建一个对象,然后再globals获取的这个字典中添加一个名字,让这个名字指向刚刚创建的对象空间而已。
元类(造物主级别)——>创建类——>创建实例对象
type还有一种完全不同的功能,动态的创建类。
type可以接受一个类的描述作为参数,然后返回一个类。(要知道,根据传入参数的不同,同一个函数拥有两种完全不同的用法是一种很傻的事情,但这在python中为了保持向后兼容性)
type可以像这样工作:
type(类名,由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
例子:
test2=type("test2",(),{
"num":100,"num2":200})
test3=type("test3",(test2,),{
"num":100,"num3":200})
添加实例方法:
def aa():
pass
test3=type("test3",(test2,),{
"num":100,"num3":200,"a":aa})
添加类方法:
@classmethod
def test_3(cls):
print("zheshileifangfa")
test3=type("test3",(),{
"test_3":test_3})
ORM是python编辑语言后端web框架Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM.
一句话解释就是:创建一个实例对象,用创建它的类名当作数据表名,用创建它的类属性对应数据表的字段,当对这个实例对象操作时,能够对应MySQL语句
#定义元类
class ModelMetaclass(type):
def __new__(cls, name, bases, attrs):
mappings=dict()
#判断是否需要保存
for k,v in attrs.items():#items作用,按关键字遍历
#判断是否指定的StringFiled或者IntegerFiled的实例对象
if isinstance(v,tuple):
print('Found mapping %s==>%s'%(k,v))
mappings[k]=v
#删除这些已经在字典中存储的属性
for k in mappings.keys():
attrs.pop(k)
#将之前的uid/name/email/password以及对应的对象引用、类名字
attrs['__mappings__']=mappings #保存属性和列的映射关系
attrs['__table__']=name #假设表明和类名一致
return type.__new__(cls,name,bases,attrs)
class Model(object,metaclass=ModelMetaclass):
def __init__(self,**kwargs):
for name,value in kwargs.items():
setattr(self,name,value)
def save(self):
fileds=[]
args=[]
for k,v in self.__mappings__.items():
fileds.append(v[0])
args.append(getattr(self,k,None))
args_temp=list()
for temp in args:
#判断如果是数字类型
if isinstance(temp,int):
args_temp.append(str(temp))
elif isinstance(temp,str):
args_temp.append("""'%s'"""%temp)
sql='insert into %s(%s)values(%s)'%(self.__table__,','.join(fileds),','.join(args_temp))
print('SQL:%s'%sql)
class User(Model):
uid=('uid',"int unsigned")
name=('username',"varchar(30)")
email=('email',"varchar(30)")
password=('password',"varchar(30)")
u=User(uid=12345,name="zhang",email='[email protected]',password='my-pwd')
u.save()