如何从一个对象别名所有方法?

时间:2019-03-28 14:02:12

标签: python python-3.x object interpreter interactive

我创建的脚本实际上是其他用户在上面编写代码的环境。

我已经在一个类中声明了几种方法并实例化了一个对象,以便用户可以将这些方法用作简单的解释器函数,如下所示:

from code import interact

class framework:
    def method1(self, arg1):
    # code for method1
    def method2(self, arg2):
    # code for method2

def main():
    fw = framework()

    # Aliases
    method1 = fw.method1
    method2 = fw.method2

    interact(local=locals())

由于我不希望用户使用fw.method1(arg)调用方法,因此我设置了别名。问题是,由于框架类正在开发中,因此我必须使用创建的方法的新别名不断更新主脚本。

是否有一种简单的方法来消除调用中的“ fw.”部分,并使类框架下的所有方法在main下自动可见?

4 个答案:

答案 0 :(得分:4)

您可以控制传递给header: { height: 65, items: user.login ? [{ xtype:'avatest', },{ xtype:'button', text: user.login ? 'up' : 'in', cls:'mainbuttons', handler: function() { user.login ? window.location.assign("/accounts/logout/") : Ext.Viewport.toggleMenu('right'); } },{ xtype:'button', text:'info', cls:'mainbuttons', margin: '0, 2 , 8, 0' }] : [{ xtype:'button', text: user.login ? 'up' : 'in', cls:'mainbuttons', handler: function() { user.login ? window.location.assign("/accounts/logout/") : Ext.Viewport.toggleMenu('right'); } },{ xtype:'button', text:'О сервисе', cls:'mainbuttons', margin: '0, 2 , 8, 0' }], title : { text : 'MYAPP(pre-alpha)', cls: 'header-cls' }, }, 的字典,因此不必在interact中使用局部变量就可以在其中放置所需内容:

main

这适用于常规,静态和类方法。它看不到实例属性(除非它们隐藏了类属性)或继承的方法。

仅当实例将函数存储为属性时,前者才重要(在这种情况下,您可能希望或不希望它们可用)。后者的便利之处在于它省略了d={} for n in vars(framework): if n.startswith('_'): continue # probably x=getattr(fw,n) if callable(x): d[n]=x interact(local=d) ;如果还有其他基类,则可以通过搜索object来轻松地将它们包括在内(并且仍然省略framework.__mro__)。

答案 1 :(得分:1)

我不知道您打算如何使用这些函数,但是如果它们不是static,则可能无法在该类之外使用:

fs = [func for func in dir(c) if callable(getattr(c, func)) and not func.startswith("__")]
for func in fs:
    globals()[func] = getattr(c, func)

这会将c类中的所有自定义函数置于全局范围内。

答案 2 :(得分:0)

您基本上想做两件事:

  1. 获取类实例的方法列表
  2. 将功能动态添加到您的本地范围

前者可以使用标准库中的canceled=stripe.Subscription.list( plan='plan_Elm8GW7mwgDj5S', stripe_account=stripe_keys['acct_num'], ) for cancel in canceled.auto_paging_iter(): customer_id=cancel.customer cd=cancel.created canceled_date=datetime.datetime.fromtimestamp(cd).strftime('%m-%d-%Y') stripe.Customer.modify( customer_id, stripe_account=stripe_keys['acct_num'], metadata={'Status': 'Canceled', 'Canceled On': canceled_date} ) 模块来实现,后者可以使用inspect来实现。

尝试以下操作:

vars

答案 3 :(得分:0)

这里类似于@Davis Herring的回答,充实并重新包装:

#from code import interact

def interact(local):
    local['method1'](42)
    local['method2']('foobar')


class Framework:
    def method1(self, arg1):
        print('Framework.method1({!r}) called'.format(arg1))
    def method2(self, arg2):
        print('Framework.method2({!r}) called'.format(arg2))


def get_callables(obj):
    return {name: getattr(obj, name) for name in vars(obj.__class__)
                if callable(getattr(obj, name))}

def main():
    fw = Framework()

#    # Aliases
#    method1 = fw.method1
#    method2 = fw.method2

    interact(local=get_callables(fw))


if __name__ == '__main__':
    main()

输出:

Framework.method1(42) called
Framework.method2('foobar') called