python 怎么根据参数执行不同的函数?

2014-12-30 11:48:20 +08:00
 recall704

假如我有这样的方法

def AAA_talk():
    pass

def AAA_fly():
    pass

def BBB_talk():
    pass

def BBB_fly():
    pass

然后我有一个函数

def handle_check(name):
    pass

h = handle_check(name="AAA")
我就可以使用h.AAA_talk 和 h.AAA_fly
如果 h = handle_check(name="BBB")
我就可以使用h.BBB_talk 和 h.BBB_fly

能构造个类什么的也可以,求方法思路?

6517 次点击
所在节点    Python
14 条回复
ligyxy
2014-12-30 12:09:05 +08:00
getattr()或者locals()
hahastudio
2014-12-30 12:14:58 +08:00
你需要一个 super class Foo,里面有 talk(self),fly(self)
然后 class AAA(Foo), class BBB(Foo) 继承,重写 talk 和 fly 的实现
handle_check 里传类的名字,比如 handle_check(AAA)
函数里实例一个 AAA,然后再 talk,fly
lookhi
2014-12-30 12:50:26 +08:00
直接点. {name:func}
chevalier
2014-12-30 12:53:32 +08:00
看一下 eval
yakczh
2014-12-30 13:17:19 +08:00
这是工场模式吗?
iT2afL0rd
2014-12-30 13:18:19 +08:00
建议了解一下多态的特性!
recall704
2014-12-30 13:18:57 +08:00
@hahastudio 比较想用这种方法,但是不会写。
recall704
2014-12-30 13:33:11 +08:00
@hahastudio 其实我真正想的是这样的,用一个工厂模式:

class A(object):

def talk(self):
print 'A talk'
def fly(self):
print 'A fly'

class B(object):

def talk(self):
print 'B talk'

def fly(self):
print 'B fly'

class Factory(object):
def __init__(self,name):
if name == 'A':
return A()
elif name == 'B':
return B()
else:
return None

遇到的问题是,talk和fly 需要的参数不一样,有时候这个参数有,有时候没有。
recall704
2014-12-30 13:36:20 +08:00
@yakczh 我就是想用工厂模式,但参数不对劲

def talk(name):
pass

def fly(id):
pass

在实例化的时候,name和id有只存在一个,init的部分不好实例化。
hahastudio
2014-12-30 13:41:15 +08:00
@recall704 唉,去学一下面向对象和设计模式吧
例子:
https://gist.github.com/hahastudio/4c544040a8026e408600


扩展阅读,请搜索
python design patterns
unity0703
2014-12-30 13:41:48 +08:00
14
2014-12-30 13:44:20 +08:00
hasattr和getattr
1989922yan
2014-12-30 14:34:05 +08:00
1. 应该是 鸭子判别 的概念。
你可以建立 class AAA 和 class BBB,在方法中,直接调用他们的方法(AAA 和 BBB的方法同名,不要变)

2. 元编程,如果想玩,也可以用
clino
2014-12-30 15:07:54 +08:00
我之前用的是 locals() 来实现这种功能

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/157851

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX