既然角色生成了,那接下来当然就该开始操作了。你用鼠标对地图点了一下,一个walk字符串传到了后台程序中,现在让我们看看程序是怎么处理的:
1 if hasattr(Garen,"walk"): #传入walk字符串,使用hasattr函数判断角色是否有该方法 2 walk = getattr(Garen,"walk") #如果有则使用getattr函数取出该方法体,但不执行 3 walk() #最后执行该方法
然后你的角色就会做相应的动作:
1 C:\Python27\python.exe D:/python/s11/8day/反射/test.py 2 3 你的英雄正走向目标
释放技能也一样,当你在键盘按下技能快捷键时把对应技能名称发给程序,程序把名称的技能转换成可执行的动词执行对应的方法。反射说白了就是把你传给对象的字符串参数当成对象里的同名方法去执行,前提是该对象有这个方法。
当然,反射也不仅仅是对象专有,其他扩展到类、模块、函数等容器也都可以使用反射,下面就是反射的四个方法:
1 hasattr():根据输入参数判断某个容器中是否有已该参数为名称的内容,如果有则返回true 2 getattr():取出容器中以参数为名称的内容 3 setattr():对容器中以参数为名称的内容进行修改 4 delattr():删除容器中以参数为名称的内容
一般后面两个比较少用,了解即可
断言
断言是一个比较有意思的东西,它就想一个条件判断一样,只有满足时才会让程序走下去,不然就报错。可以用来检测系统环境是否满足程序的需要,一般在测试或者调试时使用
1 assert system == "mac" #程序只能在mac上执行,如果不满足则不让执行程序
单例模式
既是一个类,只实例化一次,只占用一块内存,各程序想用这个功能的时候就不用再实例化一个对象,而是调用同一个实例,共享内存。
举例:程序会有一个专门连接数据库的类,当用户查询数据库都会实例化一次,创建一个用于连接的对象,如果并发大的话会很浪费内存资源,使用单例实例的话就只需要实例化一次,之后大家共用一个连接实例,这样能节省大量资源。
单例模式类的创建:
1 1 class Foo(object): 2 2 __instance = None #_instance设为None,表明该类还没有实例化过 3 3 4 4 @staticmethod #设为静态方法 5 5 def singleton(): 6 6 if Foo.__instance: #判断是否实例化过,如果__instance存在则不再创建实例,而是直接返回第一次创建的实例 7 7 return Foo.__instance 8 8 else: 9 9 Foo.__instance = Foo() #如果还没有实例化过,则将实例化的对象实例绑定到__instance上,并返回该实例 10 10 return Foo.__instance
单例模式对象的创建:
1 obj = Foo.singleton()
下面关于Python的文章您也可能喜欢,不妨看看:
Ubuntu 14.04 下安装使用Python rq模块
CentOS上源码安装Python3.4
《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版]