假如我有这样的方法
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
能构造个类什么的也可以,求方法思路?
1
ligyxy 2014-12-30 12:09:05 +08:00 via Android
getattr()或者locals()
|
2
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 |
3
lookhi 2014-12-30 12:50:26 +08:00 via Android
直接点. {name:func}
|
4
chevalier 2014-12-30 12:53:32 +08:00
看一下 eval
|
5
yakczh 2014-12-30 13:17:19 +08:00
这是工场模式吗?
|
6
iT2afL0rd 2014-12-30 13:18:19 +08:00
建议了解一下多态的特性!
|
7
recall704 OP @hahastudio 比较想用这种方法,但是不会写。
|
8
recall704 OP @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 需要的参数不一样,有时候这个参数有,有时候没有。 |
9
recall704 OP |
10
hahastudio 2014-12-30 13:41:15 +08:00
@recall704 唉,去学一下面向对象和设计模式吧
例子: https://gist.github.com/hahastudio/4c544040a8026e408600 扩展阅读,请搜索 python design patterns |
11
unity0703 2014-12-30 13:41:48 +08:00
@recall704 @ligyxy
赞同 getattr() ,你可以看看这个 http://woodpecker.org.cn/diveintopython/power_of_introspection/getattr.html |
12
14 2014-12-30 13:44:20 +08:00 via Android
hasattr和getattr
|
13
1989922yan 2014-12-30 14:34:05 +08:00
1. 应该是 鸭子判别 的概念。
你可以建立 class AAA 和 class BBB,在方法中,直接调用他们的方法(AAA 和 BBB的方法同名,不要变) 2. 元编程,如果想玩,也可以用 |
14
clino 2014-12-30 15:07:54 +08:00
我之前用的是 locals() 来实现这种功能
|