V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
? Learn Python the Hard Way
Python Sites
? PyPI - Python Package Index
? http://diveintopython.org/toc/index.html
? Pocoo
值得关注的项目
? PyPy
? Celery
? Jinja2
? Read the Docs
? gevent
? pyenv
? virtualenv
? Stackless Python
? Beautiful Soup
? 结巴中文分词
? Green Unicorn
? Sentry
? Shovel
? Pyflakes
? pytest
Python 编程
? pep8 Checker
Styles
? PEP 8
? Google Python Style Guide
? Code Style from The Hitchhiker's Guide
recall704
V2EX  ?  Python

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

  •  
  •   recall704 · 2014-12-30 11:48:20 +08:00 · 6519 次点击
    这是一个创建于 3422 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    假如我有这样的方法

    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

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

    14 条回复  ?  2014-12-30 15:07:54 +08:00
    ligyxy
        1
    ligyxy  
       2014-12-30 12:09:05 +08:00 via Android
    getattr()或者locals()
    hahastudio
        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
    lookhi
        3
    lookhi  
       2014-12-30 12:50:26 +08:00 via Android
    直接点. {name:func}
    chevalier
        4
    chevalier  
       2014-12-30 12:53:32 +08:00
    看一下 eval
    yakczh
        5
    yakczh  
       2014-12-30 13:17:19 +08:00
    这是工场模式吗?
    iT2afL0rd
        6
    iT2afL0rd  
       2014-12-30 13:18:19 +08:00
    建议了解一下多态的特性!
    recall704
        7
    recall704  
    OP
       2014-12-30 13:18:57 +08:00
    @hahastudio 比较想用这种方法,但是不会写。
    recall704
        8
    recall704  
    OP
       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
        9
    recall704  
    OP
       2014-12-30 13:36:20 +08:00
    @yakczh 我就是想用工厂模式,但参数不对劲

    def talk(name):
    pass

    def fly(id):
    pass

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


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

    2. 元编程,如果想玩,也可以用
    clino
        14
    clino  
       2014-12-30 15:07:54 +08:00
    我之前用的是 locals() 来实现这种功能
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3611 人在线   最高记录 6547   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:52 · PVG 18:52 · LAX 03:52 · JFK 06:52
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com