python中if continue else_Python:告别if...else...做真正面向对象的编程

最近在给服务器做一套指令系统,大家都知道一个服务器的指令有很多,像(加金币,加道具,加经验...)

代码就像这样:

cmd = REQUEST.get("cmd", "")

ifcmd =="add_gold":

pass

elifcmd =="add_item":

pass

elifcmd =="add_exp":

pass

... ...

else:

send("cmd unknow")

exit(9)然而一个普通的游戏,指令起码也得上百,于是乎我们就拖着鼠标从头拉到尾看看if else有没有我们需要的指令。而且,如果多人维护同一个系统,比如A要加一个指令,B也要加一个指令,这个时候就会有SVN冲突的隐患。更重要的是,python作为一门面向对象的语言,难道就只能用if else处理这种问题吗,这完全是面向过程的c语言编程方式。既然作为面向对象的语言,我们就用面向对象的方法来解决问题。

什么是面向对象:把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)/泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派(dynamic dispatch)。

也就是说,我们给每个指令构建一个对象,然后每接收一个指令的时候就直接通过这个对象去处理。每加一个指令,我们创建一个文件,构造一个对象,这样代码看起来会简洁很多,而且也不会有冲突的隐患。

问题是,怎么避免if else呢。因为有这么多指令,不用if else真的有办法解决吗?

答案是有的,我们把构造的对象自动注册到一个数据结构中,如果查到cmd在这个数据结构中,那么就直接执行这个对象的特定方法就好了,想想c++的多态就明白了。

那么现在的问题就是怎么自动注册到一个数据结构中。

我们扫描同一个目录下的所有文件,找到某一个指定基类的所有子类,然后获取一个列表。

就像下面这样:

def_get_module_files(module_dir):

module_name_set = set()

try:

files = os.listdir(module_dir)

except:

print"error in generate_module_list  for directory:", module_dir

return()

forfileNameinfiles:

list = fileName.split('.')

iflen(list) ==2:

module_name = list[0]

extension = list[1]

ifextensionin("py","pyc"):

module_name_set.add(module_name)

module_name_set.discard('__init__')

returnmodule_name_set

def_get_class_list(module, base_class):

"""得到模块里面所有属于指定类子类的类"""

m = __import__(module, fromlist=[''])

cls_name = module

cls= getattr(m, cls_name,None)

ifissubclass(cls, base_class):

returncls

returnNone

defscan_classes(module_dir, base_class):

"""主要功能就是扫描一个目录 , 并把下面所有python模块中属于指定类子类的类找出来"""

class_dict = {}

module_set = _get_module_files(module_dir)

formoduleinmodule_set:

clist = _get_class_list(module, base_class)

ifclistisNone:

continue

class_dict[clist.__name__] = clist

returnclass_dict我们的目录结构如下。

cmds:

--__int__.py

--add_gold.py

--add_item.py

--add_exp.py

--base_cmd.py

我们就可以写出以下代码:

fromcmds.base_cmdimportbase_cmd

member_path = os.path.split(os.path.realpath(__file__))[0] + \cmds'

class_dict = scan_classes(member_path, base_cmd)

#然后我们每个类继承自base_cmd,写一个通用的接口deal_cmd.

cmd = REQUEST.get("cmd", "")

ifcmdinclass_dict:

a = class_dict[cmd]()

a.deal_cmd(REQUEST.__dict__['dict'])

ok,大功告成,以后每加一个指令,只需要在cmds目录增加一个**.py,继承自base_cmd,我们重写deal_cmd()方法就可以了。

对比之前与现在的两种写法,之前的写法感觉真的是弱爆了。

当然啦,平时写一个简单的if else就不用这么大费周章了,只有在特定复杂的代码结构下,才需要想有没有更加简洁的处理方法。而不是满屏的if else语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值