20180831 Python练习记录

本文探讨了Python中元类的使用,展示了如何通过元类动态地为类添加属性和方法,以及如何利用元类实现ORM(对象关系映射)。通过具体的代码示例,文章详细解释了元类的工作原理,并介绍了如何定义自定义元类来创建ORM框架,用于数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

>>> def fn(self,name='world'):
    print('Hello,%s'%name)

    
>>> Hello=type('Hello',(object,),dict(hello=fn))
>>> h=Hello()
>>> h.hello()
Hello,world
>>> class ListMetaclass(type):
    def __new__(cls,name,bases,attrs):
        attrs['add']=lambda self,value:self.append(value)
        return type.__new__(cls,name,bases,attrs)

    
>>> class Mylist(list,metaclass=ListMetaclass):
    pass

>>> L=Mylist()
>>> L.add(1)
>>> L
[1]
>>> def fn(self,name='world'):
    print('Hello,%s'%name)

    
>>> Hello=type('Hello',(object,),dict(hello=fn))
>>> h=Hello()
>>> h.hello()
Hello,world
>>> class ListMetaclass(type):
    def __new__(cls,name,bases,attrs):
        attrs['add']=lambda self,value:self.append(value)
        return type.__new__(cls,name,bases,attrs)

    
>>> class Mylist(list,metaclass=ListMetaclass):
    pass

>>> L=Mylist()
>>> L.add(1)
>>> L
[1]
>>> class User(Model):
    id=IntegerField('id')
    name=StringField('username')
    email=StringField('email')
    password=StringField('password')

    
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    class User(Model):
NameError: name 'Model' is not defined
>>>  class User(Model):
    id=IntegerField('id')
    name=StringField('username')
    email=StringField('email')
    password=StringField('password')
    
SyntaxError: unexpected indent
>>> class User(Model):
    id=IntegerField('id')
    name=StringField('username')
    email=StringField('email')
    password=StringField('password')

    
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    class User(Model):
NameError: name 'Model' is not defined
>>> class Field(object):
    def __init__(self,name,column_type):
        self.name=name
        self.column_type=column_type
    def __str__(self):
        return '<%s:%s>'%(self.__class__.__name__,self.name)

    
>>> class StringField(Field):
    def __init__(self,name):
        super(StringField,self).__init(name,'varchar(100)')
    class IntegerField(Field):
        
SyntaxError: unindent does not match any outer indentation level
>>> class StringField(Field):
    def __init__(self,name):
        super(StringField,self).__init(name,'varchar(100)')

        
>>> class IntegerField(Field):
    def __init__(self,name):
        super(IntegerField,self).__init__(name,'bigint')

        
>>> class ModelMetaclss(type):
    def __new__(cls,name,bases,attrs):
        if name=='Model':
            return type.__new__(cls,name,bases,attrs)
        print('Found model:%s'%name)
        mappings=dict()
        for k,v in attrs.items()
        
SyntaxError: invalid syntax
>>> class ModelMetaclss(type):
    def __new__(cls,name,bases,attrs):
        if name=='Model':
            return type.__new__(cls,name,bases,attrs)
        print('Found model:%s'%name)
        mappings=dict()
        for k,v in attrs.items():
            if isinstance(v,Field):
                print('Found mapping:%s'%(k,v))
                mappings[k]=v
        for k in mappings.keys():
            attrs.pop(k)
        attrs['__mappings__']=mappings
        attrs['__table']=name
        return type.__new__(cls,name,bases,attrs)

    
>>> class Model(dict,metaclass=ModelMetaclass):
    def __init__(self,**kw):
        super(Model,self).__init__(**kw)
    def __getattr__(self,key)
    
SyntaxError: invalid syntax
>>> class Model(dict,metaclass=ModelMetaclass):
    def __init__(self,**kw):
        super(Model,self).__init__(**kw)
    def __getattr__(self,key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Model'object has no attribute'%s'"%key)
    def __setattr__(self,key,value):
        self[key]=value
    def save(self):
        fields=[]
        params=[]
        args=[]
        for k,v in self.__mapping__.items():
            fields.append(v.name)
            params.append('?')
            args.append(getattr(self,k,None))
        sql='insert into %s (%s) value (%s)'%(self.__table__,','.join(fields),','.join(params))
        print('SQL:%s'%s sql)
        
SyntaxError: invalid syntax
>>> class Model(dict,metaclass=ModelMetaclass):
    def __init__(self,**kw):
        super(Model,self).__init__(**kw)
    def __getattr__(self,key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Model'object has no attribute'%s'"%key)
    def __setattr__(self,key,value):
        self[key]=value
    def save(self):
        fields=[]
        params=[]
        args=[]
        for k,v in self.__mapping__.items():
            fields.append(v.name)
            params.append('?')
            args.append(getattr(self,k,None))
        sql='insert into %s (%s) value (%s)'%(self.__table__,','.join(fields),','.join(params))
        print('SQL:%s'%s sql)
        
SyntaxError: invalid syntax
>>> def foo():
    r=some_function()
    if r=(-1):
        
SyntaxError: invalid syntax
>>> def foo():
    r=some_function()
    if r==(-1):
        return (-1)
    return r

>>> def bar():
    r=foo()
    if r==(-1):
        print('Error')
    else
    
SyntaxError: invalid syntax
>>> def bar():
    r=foo()
    if r==(-1):
        print('Error')
    else:
        pass

    
>>> x=bar()
Traceback (most recent call last):
  File "<pyshell#97>", line 1, in <module>
    x=bar()
  File "<pyshell#96>", line 2, in bar
    r=foo()
  File "<pyshell#88>", line 2, in foo
    r=some_function()
NameError: name 'some_function' is not defined
>>> bar()
Traceback (most recent call last):
  File "<pyshell#98>", line 1, in <module>
    bar()
  File "<pyshell#96>", line 2, in bar
    r=foo()
  File "<pyshell#88>", line 2, in foo
    r=some_function()
NameError: name 'some_function' is not defined
>>> try:
    print('try..')
    r=10/0
    print('result:',r)
    except ZeroDivisionError as e:
        
SyntaxError: unindent does not match any outer indentation level
>>> try:
    print('try..')
    r=10/0
    print('result:',r)
except ZeroDivisionError as e:
    print('except:',e)
finally:
    print('finally..')
print('END')
SyntaxError: invalid syntax
>>> try:    print('try..')
    r=10/0
    print('result:',r)
    
SyntaxError: unexpected indent
>>> try:
    print('try..')
    r=10/0
    print('r%d',r)
except ZeroDivisionError as e:
    print('except:',e)
finally:
    print('finally..')
print('end')
SyntaxError: invalid syntax
>>> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值