我们有一棵树,每个节点都是一个对象。
此树具有的功能是3 add(x);getmin();getmax()
树很完美;例如,如果我写
a = Heap()
a.add(5)
a.add(15)
a.add(20)
a.getmin()
a.getmax()
堆栈看起来像[5,15,20]
,现在,如果我调用getmin()
,它将打印min element = 5
,堆栈将显示为[15,20]
,依此类推。
现在问题出现了;
教授要求我们提交两个已创建的文件:main.py
和minmaxqueue.py
main.py就像这个from minmaxqueue import add, getmin, getmax
一样开始,然后已经有了一个类型的函数调用列表
add(5)
add(15)
add(20)
getmin()
getmax()
为了使我的脚本工作,我必须a=Heap()
,然后始终致电a.add(x)
。由于TA将从公共文件运行脚本,因此无法修改main.py
,以便创建对象a=Heap()
。它应该直接与add(5)
一起运行,而不是与a.add(5)
有没有办法解决这个问题?
答案 0 :(得分:4)
您可以修改模块以创建全局Heap
实例,并定义将所有内容转发到该全局实例的函数。像这样:
class Heap(object):
# all of your existing code
_heap = Heap()
def add(n):
return _heap.add(n)
def getmin():
return _heap.getmin()
def getmax():
return _heap.getmax()
或者,稍微简单一点:
_heap = Heap()
add = _heap.add
getmin = _heap.getmin
getmax = _heap.getmax
如果你看一下标准库,有些模块就是这样做的,比如random
。如果要创建多个Random
实例,则可以;如果你不关心这样做,你可以只调用random.choice
,它可以在隐藏的全局实例上运行。
当然Random
有道理;对Heap
来说,这更值得怀疑。但如果这就是教授的要求,你能做什么?
答案 1 :(得分:1)
您可以使用此功能更快地完成此操作:
def make_attrs_global(obj):
for attr in dir(obj):
if not attr.startswith('__'):
globals()[attr] = getattr(obj, attr)
它使obj
的所有属性在全局范围内定义。
只需将此代码放在minmaxqueue.py
文件的末尾:
a = Heap()
make_attrs_global(a)
现在,您应该可以在没有add
的情况下直接致电a
。这很难看但很好......