
假如我有这样的方法
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() 来实现这种功能 |