在python中,如何使类实例隐式?

在python中,如何使类实例隐式?,python,Python,我正在创建一个模块,将turtle集成到Tkinter中,我希望能够使用turtle函数,例如forward(10),而无需编写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) 下面是用户使用t

我正在创建一个模块,将turtle集成到Tkinter中,我希望能够使用turtle函数,例如
forward(10)
,而无需编写
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“隐式”呢?例如,不必键入它来调用turtle函数?我希望避免重写每个海龟函数。另外,在userModule中导入turtle会创建一个额外的窗口,我也不希望这样


对于上下文,我将向python初学者提供myModule,因此我希望它尽可能简单易用。

在myModule中,只需将moduleTurtle方法影响到变量,在用户模块中,只需在执行“从myModule导入*”后调用变量即可

#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方法。。。我的虚拟用户模块告诉我转发未定义。我从未学会使用sys,但d['el']=obj中的'el'听起来是错误的。我应该提到,我想从一个函数将turtle附加到Tkinter,但这只需要几个全局关键字就可以正常工作了。事实证明,大多数turtle函数(如forward)是由模块定义的,而不是由RawTurtle实例定义的。以下是我为使其正常工作所做的更改:
for el in tr.\uu dict\uuu.keys()
obj=getattr(tr,el)
。如果在myModule的主体中使用该代码,则该代码将正常工作。因为它将在函数中,所以我尝试实现的额外更改是将userModule改为
current\u module=sys.modules[\uu\u name\uuuu]
。(将其放入函数中可防止函数进入userModule。uu dict_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_。tr.dict.中的el与tr.dict.中的el相同。keys()不知道有什么区别吗?是的,事实上,我这样做是为了在我的模块中使用它…请参阅本部分的标题。