加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【原创】Python 封装-实现 C#实体类

(2014-09-01 10:55:03)
标签:

python

封装

实体类

分类: python
先说说我研究这个的原因。
我个人比较喜欢自己写SQL而不喜欢用ORM,我之前文章提过,《浅析我喜欢自己写SQL而不喜欢用ORM的原因
我实现Python封装实体类不是为了ORM,仅仅是为了映射,包括传递参数也会方便,仅此而已。

先看一个C#实体类:
using System;
using System.Text;

namespace StudentManager.Model
{
    public class UserInfoEntity
    {
        private string filedUserID;
        public string FiledUserID
        {
            get { return filedUserID; }
            set { filedUserID = value; }
        }

        private string filedUserName;
        public string FiledUserName
        {
            get { return filedUserName; }
            set { filedUserName = value; }
        }

        private string filedUserPwd;
        public string FiledUserPwd
        {
            get { return filedUserPwd; }
            set { filedUserPwd = value; }
        }

        private bool filedUserRole;
        public bool FiledUserRole
        {
            get { return filedUserRole; }
            set { filedUserRole = value; }
        }
        private string _roleName;

        public string RoleName
        {
            get { return FiledUserRole == false ? "学生" : "老师"; }
            set { FiledUserRole = value == "学生" ? false : true; }
        }
        private bool filedUserState;
        public bool FiledUserState
        {
            get { return filedUserState; }
            set { filedUserState = value; }
        }
        private string _state;
        public string State
        {
            get { return FiledUserState == false ? "不可用" : "可用"; }
            set { FiledUserState = value == "可用" ? true : true; }
        }
    }
}

-------------------------------------------------------------------------------------------------------
以上就是一个简单点的C#实体类,下面是我写的Python实现实体类的整个代码测试过程。

class A(object):
    def __init__(self):
        self.__id = None
    def id(self,id = None):
        def __get__():
            print 'get id..'
            return self.__id
        def __set__(id):
            print 'set id..'
            self.__id = id
        if id:
            return __set__(id)
        else:
            return __get__()


class B(object):
    def __init__(self, id=None, name=None):
        self.__id = None
        self.id = self._id(id=id)
    def _id(self,id = None):
        def __get__():
            print 'get id..'
            return self.__id
        def __set__(id):
            print 'set id..%s' % (id + 10)
            self.__id = id
            return self.__id
        if id:
            return __set__(id)
        else:
            return __get__()
    
class C(object):
    def __init__(self):
        self.__id = None
    def __setattr__(self, name, value):
        if name == 'id':
            print 'set id ..'
            self.__id = value
    def __getattribute__(self, name):
        if name == 'id':
            print 'get id ...'
            return self.__id


class D(object):
    def __init__(self, **args):
        self.clumns = ['id', 'name']
        for i in self.clumns:
            exec("self.__%s='%s'" % (i, args.get(i)))
            
        self.__setattr__ = self.__setattr__
        self.__getattribute__ = self.__getattribute__
        
    def __setattr__(self, name, value):
        if not self.check_clumns(name): return
        print 'set:%s value:%s ...' % (name, value)
        if name == 'id':
            self.__id = value
            
    def __getattribute__(self, name):
        #if not self.check_clumns(name): return
        #RuntimeError: maximum recursion depth exceeded
        print self.check_clumns(name)
        exec('value = self.__%s' % name)
        #value = self.name
        print 'get %s  value:%s ...' % (name, value)
        return value
        
    def check_clumns(self, name):
        print name in self.self.clumns
        return name in self.self.clumns
        
        


class E(object):
    def __init__(self, **args):
        self.clumns = ['id', 'name']
        for i in self.clumns:
            exec("self.__%s='%s'" % (i, args.get(i)))
            
        self.__setattr__ = self.__setattr
        self.__getattribute__ = self.__getattribute
        
    def __setattr(self, name, value):
        if not self.check_clumns(name): return
        print 'set:%s value:%s ...' % (name, value)
        if name == 'id':
            self.__id = value
            
    def __getattribute(self, name):
        if not self.check_clumns(name): return
        exec('value = self.__%s' % name)
        #value = self.name
        print 'get %s  value:%s ...' % (name, value)
        return value
        
    def check_clumns(self, name):
        if name in self.self.clumns:return True
        
class F(object):
    def __init__(self, **args):
        self.clumns = ['id', 'name']
        for i in self.clumns:
            exec("self.__%s='%s'" % (i, args.get(i)))
            
        self.__setattr__ = self.__setattr
        self.__getattribute__ = self.__getattribute
        
    def __setattr(self, name, value):
        print 'set name:%s' % name
        if name not in self.clumns: return
        print 'set:%s value:%s ...' % (name, value)
        if name == 'id':
            self.__id = value
            
    def __getattribute(self, name):
        print 'get name:%s' % name
        if name not in self.clumns: return
        exec('value = self.__%s' % name)
        #value = self.name
        print 'get %s  value:%s ...' % (name, value)
        return value

class G(object):
    def __init__(self, **args):
        global clumns
        clumns = ['id', 'name']
        for i in clumns:
            exec("self.__%s='%s'" % (i, args.get(i)))
            
    def __setattr__(self, name, value):
        global clumns
        print 'set:%s value:%s ...' % (name, value)
        if name not in clumns: return
        print 'set:%s value:%s ...' % (name, value)
        if name == 'id':
            self.__id = value
            
    def __getattribute__(self, name):
        global clumns
        print 'get name:%s' % name
        if name not in clumns: return
        exec('value = self.__%s' % name)
        #value = self.name
        print 'get %s  value:%s ...' % (name, value)
        return value

class H(object):
    def __init__(self, **args):
        global clumns
        clumns = ['id', 'name']
        for i in clumns:
            s = 'global %s' % i
            print s
            exec(s)
            s = "%s='%s'" % (i, args.get(i))
            print s
            exec(s)
            
    def __setattr__(self, name, value):
        global clumns
        for i in clumns:
            s = 'global %s' % i
            print s
            exec(s)
        print 'set:%s value:%s ...' % (name, value)
        if name not in clumns: return
        print 'set:%s value:%s ...' % (name, value)
        if name == 'id':
            __id = value
            
    def __getattribute__(self, name):
        global clumns
        for i in clumns:
            exec('global %s' % i)
        print 'get name:%s' % name
        if name not in clumns: return
        exec('value = %s' % name)
        #value = self.name
        print 'get %s  value:%s ...' % (name, value)
        return value


class _H(object):
    def __init__(self):
        pass
class H(object):
    def __init__(self, **args):
        global clumns, HH
        HH = _H()
        clumns = ['id', 'name']
        for i in clumns:
            s = "HH.%s='%s'" % (i, args.get(i))
            print s
            exec(s)
            
    def __setattr__(self, name, value):
        global clumns, HH
        print 'set:%s value:%s ...' % (name, value)
        if name not in clumns: return
        print 'set:%s value:%s ...' % (name, value)
        if name == 'id':
            s = "HH.%s = %s" % (name, value)
            
    def __getattribute__(self, name):
        global clumns, HH
        print 'get name:%s' % name
        if name not in clumns: return
        exec('value = HH.%s' % name)
        print 'get %s  value:%s ...' % (name, value)
        return value



class I(object):
    def __init__(self, **args):
        global _I, clumns
        class __I(): pass
        _I = __I()
        clumns = ['id', 'name']
        for i in clumns:
            exec("_I.%s='%s'" % (i, args.get(i)))
            
    def __setattr__(self, name, value):
        global clumns, _I
        print 'set key:%s value:%s ...' % (name, value)
        if name not in clumns: return
        print 'set key:%s value:%s ...' % (name, value)
        if name == 'id':
            exec("_I.%s = %s" % (name, value))
                        
    def __getattribute__(self, name):
        global clumns, _I
        print 'get key:%s' % name
        if name not in clumns: return
        exec('value = _I.%s' % name)
        print 'get key:%s  value:%s ...' % (name, value)
        return value



class J(object):
    def __init__(self, **args):
        global clumns
        clumns = ['id', 'name']
        #self.clumns.append('clumns')
        for i in clumns:
            exec("self._%s='%s'" % (i, args.get(i)))
            
    def __setattr__(self, name, value):
        global clumns
        name = name[1:]
        print 'set key:%s value:%s ...' % (name, value)
        if name not in clumns:
            print 'Error:'
            return
        print 'set key:%s value:%s ...' % (name, value)
        if name == 'id':
            s = "self._%s = %s" % (name, value)
            print s
            exec(s)
            
    def __getattr__(self, name):
        global clumns
        print 'get key:%s' % name
        if name == 'clumns':
            return clumns
        if name not in clumns: return
        s = 'value = self._%s' % name
        print s
        exec(s)
        return value


#__getattribute__()  -- > Descriptor.__get__()  -- > __dict__  -- > readonly Descriptor.__get__()  -- > __getattr__()
#__setattr__()  -- > Descriptor.__set__()  -- > __dict__
#__delattr__()  -- > Descriptor.__delete__()  -- > __dict__

class K(object):
    def __init__(self, **args):
        clumns = ['id', 'name']
        super(K, self).__setattr__("clumns", clumns)
        #self.clumns.append('clumns')
        for i in clumns:
            value = args.get(i, None)
            super(K, self).__setattr__("_" + i, value)
            
    def __setattr__(self, name, value):
        clumns = super(K, self).__getattribute__("clumns")
        #name = name[1:]
        print 'set key:%s value:%s ...' % (name, value)
        if name not in clumns:
            print 'Error:'
            return
        print 'set key:%s value:%s ...' % (name, value)
        if name == 'id':
            super(K, self).__setattr__("_" + name, value)
            return
            
    def __getattr__(self, name):
        clumns = super(K, self).__getattribute__("clumns")
        print 'get key:%s' % name
        if name == 'clumns':
            return clumns
        if name not in clumns: return
        s = 'value = self._%s' % name
        # maximum recursion depth exceeded ??? why not??
        # if this method is __getattribute__ , result is None...
        print s
        exec(s)
        return value

class L(object):
    def __init__(self, **args):
        clumns = ['id', 'name']
        super(L, self).__setattr__("clumns", clumns)
        #self.clumns.append('clumns')
        for i in clumns:
            value = args.get(i, None)
            super(K, self).__setattr__("_" + i, value)
            #first:__getsttrbute__ get "__class__", return None
            #TypeError: super(type, obj): obj must be an instance or subtype of type
            
    def __setattr__(self, name, value):
        clumns = super(L, self).__getattribute__("clumns")
        #name = name[1:]
        print 'set key:%s value:%s ...' % (name, value)
        if name not in clumns:
            print 'Error:'
            return
        print 'set key:%s value:%s ...' % (name, value)
        if name == 'id':
            super(L, self).__setattr__("_" + name, value)
            return
            
    def __getattribute__(self, name):
        clumns = super(L, self).__getattribute__("clumns")
        print 'get key:%s' % name
        if name == 'clumns':
            return clumns
        if name not in clumns: return
        s = 'value = self._%s' % name
        # maximum recursion depth exceeded ??? why not??
        print s
        exec(s)
        return value



class M(object):
    def __init__(self, **args):
        clumns = ['id', 'name']
        super(M, self).__setattr__("clumns", clumns)
        #self.clumns.append('clumns')
        for i in clumns:
            value = args.get(i, None)
            super(M, self).__setattr__("_" + i, value)
            
    def __setattr__(self, name, value):
        clumns = super(M, self).__getattribute__("clumns")
        #name = name[1:]
        print 'set key:%s value:%s ...' % (name, value)
        if name not in clumns:
            print 'Error:'
            return
        print 'set key:%s value:%s ...' % (name, value)
        if name == 'id':
            super(M, self).__setattr__("_" + name, value)
            return
            
    def __getattr__(self, name):
        clumns = super(M, self).__getattribute__("clumns")
        print 'get key:' +  name,
        if name == 'clumns':
            print clumns
            return clumns
        if name not in clumns:
            print "Key:%s not in clumns:%s" % (name, clumns)
            return
        value = super(M, self).__getattribute__("_" + name)
        print " Value:%s" % value
        return value
    这个就是比较不错的实现方式了,去掉里面没用的东西如下:
class N(object):
    def __init__(self, **args):
        clumns = ['id', 'name', 'state']
        super(N, self).__setattr__("clumns", clumns)
        for name in clumns:
            value = args.get(name, None)
            if name == "state":
                value = True if value == 'Yes' else False
            super(N, self).__setattr__("__" + name, value)
            
    def __setattr__(self, name, value):
        clumns = super(N, self).__getattribute__("clumns")
        if name not in clumns:
            return
        if name == 'id':
            value = value
        elif name == 'state':
            value = True if value == 'Yes' else False
        print name, value
        super(N, self).__setattr__("__" + name, value)
        return
            
    def __getattr__(self, name):
        clumns = super(N, self).__getattribute__("clumns")
        if name == 'clumns':
            return clumns
        if name not in clumns:
            return None
        value = super(N, self).__getattribute__("__" + name)
        if name == 'state':
            value = 'Yes' if value else 'No'
        return value


实测通过。
递归这个真。。。

参考:http://blog.sina.com.cn/s/blog_a15aa56901018ips.html

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有