【问题标题】:In python, how do I make a class instance be implicit?在python中,如何使类实例隐式?
【发布时间】:2019-10-08 18:10:03
【问题描述】:

我正在创建一个将turtle 集成到Tkinter 中的模块,并且我将能够使用诸如forward(10) 之类的turtle 函数,而无需编写moduleTurtle.forward(10)。这是我当前的代码:

#myModule
import Tkinter as tk
import turtle as tr

root = tk.Tk()
canvas = tk.Canvas(root)
canvas.pack()
moduleTurtle = tr.RawTurtle(canvas)

这是用户使用 turtle 必须编写的内容:

#userModule
from myModule import *
moduleTurtle.forward(10)

我怎样才能使 moduleTurtle “隐式”,因为不必键入它来调用海龟函数?我想避免重写每一个海龟函数。此外,在 userModule 中导入 turtle 会创建一个额外的窗口,我也不想要。

关于上下文,我将把 myModule 提供给 python 初学者,所以我希望它尽可能简单易用。

【问题讨论】:

    标签: python


    【解决方案1】:

    在 myModule 中,只是将 moduleTurtle 方法影响到一个变量,而在用户模块中,只需在执行 'from myModule import *' 后调用变量

    #myModule 
    import Tkinter as tk
    import turtle as tr
    
    root = tk.Tk()
    canvas = tk.Canvas(root)
    canvas.pack()
    moduleTurtle = tr.RawTurtle(canvas)
    forward = moduleTurtle.forward #method "forward" of moduleTurtle affected to forward
    
    
    
    #userModule
    from myModule import *
    forward(10)
    

    对于一般用法,在 myModule 中使用它

    #myModule 
    import Tkinter as tk
    import turtle as tr
    import sys
    
    
    root = tk.Tk()
    canvas = tk.Canvas(root)
    canvas.pack()
    moduleTurtle = tr.RawTurtle(canvas)
    current_module = sys.modules[__name__]
    d = current_module.__dict__
    for el in moduleTurtle.__dict__:
        if not el.startswith('_'):
            obj = getattr(moduleTurtle, el)
            if hasattr(obj, '__call__'):
                d[el] = obj
    

    【讨论】:

    • 我认为OP举了一个例子,而是想通过他自己的模块向用户公开所有的turtle方法。
    • 我在完成这项工作时遇到了麻烦...我的虚拟 userModule 告诉我前向未定义。我从未学会使用 sys,但 d['el'] = obj 中的 'el' 听起来是错误的。我应该提到我想从一个函数将turtle附加到Tkinter,但这只需要更多的全局关键字即可正常工作。
    • ChaoTech 看到变化是 d[el]=obj
    • 好的,我已经让它工作了,主要是。原来turtle的大部分函数,​​比如forward是由模块定义的,而不是RawTurtle实例。以下是我为使其正常工作所做的更改:for el in tr.__dict__.keys()obj = getattr(tr, el)。如果在 myModule 的主体中使用此代码,它将起作用。因为它将在一个函数中,所以我试图实现的额外更改是将 userModule 赋予current_module = sys.modules[__name__] 而不是__name__。 (把它放在一个函数中可以防止函数在导入阶段进入 userModule.__dict__)
    • ChaoTech 是同样的东西,但更强大。 for el in tr.__dict__ 和 for el in tr.__dict__.keys() 不知道有什么区别?是的,事实上我这样做是为了在 myModule 中使用它...请参阅这部分的标题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2018-01-29
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    相关资源
    最近更新 更多