for 以后的新同事,通过搜索createDef 找到这里的,希望不会被误导 呵呵:) ################################################ ## main process ## function createDef('FileName') return a new CLASS ################################################ def createDef (strSysIn): listDefInfo = [] # read the File listDefInfo = ReadDefFile(strSysIn)#strSysIn such as 'rpc.def' if listDefInfo == None: raise 'Read File Error Unknown Reason/n' return None # bulidClass ResClass = AnalyzeDef(listDefInfo) return ResClass() ################################################ ## read the complete File information ## return Useful information list ## such as ['function foo(int,int);','property int Hp;'] ################################################ def ReadDefFile(strTempIn): bolGoodFile = True listDefInfo = [] #the file should be copy in F:// temporary strFileName = 'F://'+strTempIn fCreate = file(strFileName) strTemp = fCreate.readline() strTemp = strTemp.strip()#delete the blank in behind or front of word if strTemp.find('def') == 0: #second line should be '{' strTemp = fCreate.readline() strTemp = strTemp.strip()#delete blank if strTemp == '{': #scan each line and add the info to infolist while True: strTemp = fCreate.readline() if strTemp == '': # if execute then read the end of file. blank line is '/n' bolGoodFile = False raise 'not found }' break strTemp = strTemp.strip() if strTemp == '}': break elif strTemp != '': listDefInfo.append(strTemp) #add useful info else: raise '''In second line,have not find '{' ! ''' bolGoodFile = False else: raise '''In first line,have not find 'def' ! ''' bolGoodFile = False #close file fCreate.close() if bolGoodFile == True: return listDefInfo else: return None ################################################ ## Global parameter ## GRunFuction = string # the name of using fuction ## GRunProperty = string #the name of using fuction ################################################ GRunFuction = '' GRunProperty = '' listTypeOk = ['int','string','float'] #support parameter name listFuctName = [] listPropName = [] listSetGetName = [] ################################################ ## analyze the file info and return the new class ## def AnalyzeDef(listDefInfo) ## listDefInfo such as ['function foo(int,int);','property int Hp;'] ################################################ def AnalyzeDef(listDefInfo): dictProperty={} #class property dictionary dictTypeName={} #strName : listTypeName numOfInfo = len(listDefInfo) #analyze each line for i in range(0,numOfInfo): strTemp = listDefInfo[i] if strTemp[0:8] == 'function': #process the fuction strTemp = strTemp[9:] #now is 'foo(int,int);' index = strTemp.find('(') strName = strTemp[:index] strName = strName.strip() strKind = strTemp[index:] strKind = strKind.strip() listTypeName = AnalyzeFTypeName(strKind)# convert to ['int','int'] dictTypeName[strName] = listTypeName if listTypeName == None: raise 'analyze def file fuction error' def TempF(*args): global GRunFuction NumPara = len(dictTypeName[GRunFuction]) #record the Running Fuction match typename list listTemp = dictTypeName[GRunFuction] if len(args) != NumPara: raise 'num of parameter in function error' for j in range (0,NumPara): if listTemp[j]== 'int': if args[j].__class__ != int: raise 'type(int) of parameter mismatch' elif listTemp[j]== 'string': if args[j].__class__ != str: raise 'type(string) of parameter mismatch' elif listTemp[j]== 'float' : if args[j].__class__ != float: if args[j].__class__!= int: raise 'type(float) of parameter mismatch' print 'do',GRunFuction,'Function' def GetF(self): return TempF #setf is none ,so it read only dictProperty[strName]=property(GetF) global listFuctName listFuctName.append(strName) elif strTemp[0:8] == 'property': #process the property strTemp = strTemp[9:] listPResult = AnalyzePTypeName(strTemp)#listPResult ['strname','type'] if listPResult == None : raise 'analyze property type name error' strName = listPResult[0] strTypeName = listPResult[1] strSetName = 'set_'+ strName strGetName = 'get_'+ strName dictTypeName[strName] = strTypeName #{Hp:int,..} def TempPGet(self): return self.__class__.__dict__['get_'+GRunProperty](self) def TempPSet(self,x): return self.__class__.__dict__['set_'+GRunProperty](self,x) dictProperty[strName]=property(TempPGet,TempPSet) def set_Name(self,x): global GRunProperty if dictTypeName[GRunProperty]== 'int': if x.__class__ != int: raise 'type(int) of parameter mismatch' elif dictTypeName[GRunProperty]== 'string': if x.__class__ != str: raise 'type(string) of parameter mismatch' elif dictTypeName[GRunProperty]== 'float' : # attention int is also the available for float if x.__class__ != float: if x.__class__!= int: raise 'type(float) of parameter mismatch' self.__class__.__dict__['DictPropValue'][GRunProperty] = x print 'set',GRunProperty,'property' def get_Name(self): global GRunProperty print 'get',GRunProperty,'property' class t(object): #because t is relevent with the new class instance,so oself is necessary strname = None oself = None def __init__ (self,strname,oself): self.strname = strname self.oself = oself def __str__(self): return str((self.oself.__class__.__dict__['DictPropValue'])[self.strname]) return t(GRunProperty,self) dictProperty[strSetName]=set_Name dictProperty[strGetName]=get_Name global listPropName listPropName.append(strName) global listSetGetName listSetGetName.append(strSetName) listSetGetName.append(strGetName) else: raise '''have not found "property" or "function" !''' # build new class bases = (object,) def __init__(self): pass dictProperty['__init__']=__init__ # setattr and getattribute def __setattr__(self,name,value): if self.__class__.__dict__.has_key(name): global listPropName global listFuctName global GRunFuction global GRunProperty global listSetGetName if listFuctName.count(name)>0: GRunFuction = name elif listPropName.count(name)>0: GRunProperty = name elif listSetGetName.count(name)>0: GRunProperty = name[4:] object.__setattr__(self,name,value) else: #can not add new fuction or property raise 'can not add new fuction or property' # __getattr__ can not intercept the existent property # so should use __getattribute__ to replace def __getattribute__(self,name): global listPropName global listFuctName global GRunFuction global GRunProperty global listSetGetName if listFuctName.count(name)>0: GRunFuction = name elif listPropName.count(name)>0: GRunProperty = name elif listSetGetName.count(name)>0: GRunProperty = name[4:] return object.__getattribute__(self,name) dictProperty['__setattr__']=__setattr__ dictProperty['__getattribute__']=__getattribute__ dictProperty['DictPropValue'] = {} ResClass = type('ResClass',bases,dictProperty) return ResClass ################################################ ## function name analyze ## def AnalyzeFTypeName(strKind): ## '(int,int)' to ['int','int'] ################################################ def AnalyzeFTypeName(strKind): startidx = strKind.find('(')+1 index = strKind.find(',') global listTypeOk #listTypeOk = ['int','string','float'] listResult = [] #scan until the second by count down while index != -1: name = strKind[startidx:index] name = name.strip() x = listTypeOk.count(name) if x > 0: listResult.append(name) startidx = 0 strKind = strKind[index+1:] index = strKind.find(',') else : raise 'parameter name unsupport' return None index = strKind.find(')') name = strKind[startidx:index] name = name.strip() if name == '': return listResult else: x = listTypeOk.count(name) if x > 0: listResult.append(name) return listResult else: raise 'parameter name unsupport' return None ################################################ ## parameter name analyze ## def AnalyzePTypeName(strKind): ## 'int Hp;' to ['int','Hp'] ################################################ def AnalyzePTypeName(strKind): strKind = strKind.strip()# ' int...' to 'int... ' global listTypeOk #listTypeOk = ['int','string','float'] l = len(listTypeOk ) for i in range(0,l): strTemp = listTypeOk[i] index = strKind .find(strTemp) if index == 0: index = index +len(listTypeOk[i]) indexEnd = strKind .find(';') if indexEnd == -1: raise 'have not found ;' strKind = strKind[index:indexEnd] strKind = strKind.strip() return [strKind,listTypeOk[i]] break raise 'Not found support parameter type' return None ################################################ ## 主流程 ################################################ d= createDef('rpc.def') c= createDef('rpc.def') #测试用例 d.foo(1,2) #合法 d.Name = 'wangchu' print d.Name c.Name = 'chuwang' print c.Name print d.Name q = d.Name p = c.Name print 'q',q print 'p',p c.Name = '1' d.Name ='2' print 'q',q print 'p',p d.HSDFI() print id(d.Name),id(c.Name) #c.Name = 'xxx' #print d.Name #q = d.Name #d.Name = '3' #d.Hp = 3 #print q #q = d.Hp #print q #d.wangchu(2,'33',2.5) #d.W=4 #d.hello("nihao") # 合法 #d.foo(1,"nihao",3) # 不合法 #d.hello(1) #不合法 #d.hello("nihao",2) # 不合法 #d.hello = 1 # 不合法 #d.Name = "mmo" # 、 #d.set_Name("mmo") #对应set_xxx函数的实现为打印 "set xxx property" #n = d.Name #时调用 隐式函数n = d.get_Name() #print n #d.set_Name("ds") #print n #此时print(n), 输出 "game" #d.Name = "game" #对应get_xxx函数的实现为打印 "get xxx property" #d.get_Name() #d.Blood = 100 # 违法 #d.Hp = "abcd" #违法 #d.Hp = 100 #合法 #d.set_Wangchu(32) #q = d.get_Wangchu() #d.set_Wangchu(3) #print q